题目描述:
给定偏序关系,求出偏序串。
解题思路:
最笨的方法,,全排列+判断是否符合偏序关系。自己写permution,然后在中间加个简单的剪枝。注意:gets读到EOF是返回0!
代码:
#include <stdio.h>
#include <stdlib.h>
char constraints[51][2];
char letter[21], input[204], result[21];
int l_len, c_len, flag[123];
int judge(int len)
{
int i, j;
for(i=0;i<c_len;i++){
for(j=0;j<len;j++){
if(result[j] == constraints[i][0])
break;
if(result[j] == constraints[i][1])
return 0;
}
}
return 1;
}
void permution(int num)
{
int i;
if(num == l_len){
if(judge(l_len) == 1){
for(i=0;i<l_len;i++)
printf("%c",result[i]);
printf("\n");
}
}else{
for(i=0;i<l_len;i++){
if(flag[letter[i]]==0){
result[num] = letter[i];
//判断judge
if(judge(num+1) == 0)
continue;
flag[letter[i]] = 1;
permution(num+1);
flag[letter[i]] = 0;
}
}
}
}
int cmp(const void *a, const void *b)
{
char *a1 = (char*)a;
char *b1 = (char *)b;
return *a1 - *b1;
}
main()
{
int i, j;
while( gets(input)){ // 读到EOF返回0
j = 0;
for(i=0;i<strlen(input);i=i+2)
letter[j++] = input[i];
l_len = j;
gets(input);
j=0;
for(i=0;i<strlen(input);i=i+4){
constraints[j][0] = input[i];
constraints[j++][1] = input[i+2];
}
c_len = j;
qsort(letter,l_len,sizeof(char),cmp);
memset(flag,0,123);
permution(0);
printf("\n");
}
system("pause");
return 0;
}