回复 38楼 beyondyf
杨大哥,好久不见。最近你也不常来了,我一个算法渣渣也变成了别人眼里的大神
,颇有几分山中无老虎,猴子称大王的味道。[此贴子已经被作者于2016-12-20 11:53编辑过]

[fly]存在即是合理[/fly]
程序代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Len_str 128
#define Len_rules 3
/*************************
*功能:根据二维数组所表述的字符出现先后次序,整理形成一个字符串
*来自: http://bbs.bccn.net/thread-472197-1-1.html
*思路:每一条规则的第一顺位字符都有可能会是即将形成的字符串的第一个字符,只要再确认一下该字符是否不属于其他任何规则的次顺位字符就可以输出它到屏幕。逐渐缩小规则的规模直到所有规则被"读尽"
*作者:Chauncy523@*************************/
// 根据二维数组求出字符串,通过ans指针返回数据
void fun(char array[][Len_rules], int len, char *ans) {
printf("%d",len);
char**Head=(char**)malloc(sizeof(char*)*len);/*保存每条规则中的第一个字母所在位置*/
for(int i=0; i<len; i++)Head[i]=&array[i][0];
char**End=(char**)malloc(sizeof(char*)*len);/*用于标记检查每条规则的使用情况*/
for(int i=0; i<len; i++)End[i]=&array[i][Len_rules];
int flag;/*指示当前是否从所有规则中跳出合适的字母作为首字符*/
do {
flag=0;
for(int i=0; i<len; i++) {/*从Head[]中挑一个作为首字符*/
if(Head[i]==End[i])continue;
flag=2;
for(int m=0; m<len&&flag==2; m++) {
if(Head[m]==End[m])continue;
for(char*n=Head[m]+1; n!=End[m]&&flag==2; n++) {
if(*n==*Head[i])flag=1;
}
}
if(flag==2) {/*将找到的字符写入ans*/
*ans=*Head[i];
break;
}
}
for(int i=0; i<len; i++) { /*消除所有刚刚找到并输出的首字符*/
if(Head[i]==End[i])continue;
if(*Head[i]==*ans)++Head[i];
}printf("%d=flag",flag);
printf("{%c ",*ans);
for(int i=0; i<len; i++) {
printf("(%d)",Head[i]-&array[i][0]);
}
printf("}\n");
ans++;/*ans指向一个新的空位置,等待下一轮写入*/
} while(flag!=0);
*(ans-1)='\0';
}
int main() {
char str[Len_str] = {0};
char array[][Len_rules] = {{'t', 's', 'f'}, {'a', 's', 'u'}, {'m', 'a', 'f'}, {'a', 'i', 'n'}, {'s', 'u', 'n'}, {'m', 'f', 'u'},
{'a', 't', 'h'}, {'t', 'h', 'i'}, {'h', 'i', 'f'}, {'m', 'h', 'f'}, {'a', 'u', 'n'}, {'m', 'a', 't'},
{'f', 'u', 'n'}, {'h', 's', 'n'}, {'a', 'i', 's'}, {'m', 's', 'n'}, {'m', 's', 'u'}
};
fun(array, sizeof(array) / sizeof(array[0]), str);
puts(str); // mathisfun
return 0;
}方法应该是对的,不过算法复杂度蛮高的。思路应该是比较清晰,易于理解的吧。[此贴子已经被作者于2016-12-25 13:01编辑过]
