破碎的项链

来源:百度知道 编辑:UC知道 时间:2024/05/21 16:00:29
Broken Necklace

破碎的项链

译 by timgreen

你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子:

1 2 1 2
r b b r b r r b
r b b b
r r b r
r r w r
b r w w
b b r r
b b b b
b b r b
r r b r
b r r r
b r r r
r r r b
r b r r r w

/*
拆出来的元素最大应位于两个不同的元素分界处,
故将相同的元素合并,并用结构体Node保存,并将所
有保存后的元素的结构体形成环状双向链表。其后就是
对该环状双向链表的查找和处理,为防止在访问过程中
重复访问已访问过的元素。故设两个标志指针.已在vc上
运行通过,相信也能在其他的编译器上通过,看不懂的可
以问我也可以用printf输出疑惑处的结果也帮组理解*/
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
char Necklace[350];//保存珠子
struct Node
{
char Letter; //珠子颜色rwb
short num; //珠子数量
short subscript; //起始珠子的下标
struct Node *pre; //前指针
struct Node *next; //后指针
};

typedef struct Node HNode;
int forward(HNode *head);//向前处理函数
int reback(HNode *head); //向后处理函数
short int NodeNum[350]; //存放从每一节点断开时能取得的珠子数
short int Keep[100]; //存放取得最大珠子数的节点的位置
int n;
HNode *sign1; //标志1
HNode *sign2; //标志2
void main()
{
HNode * Head; //头指针
struct Node *p;
struct Node *q;
int max,k,j,i=0; //max