/**
* poj1270 DFS
* 算是比较经典的DFS,先把第一行输入的字符存下来,排序。再把第二行给的那些约束也存下来,用c数组保存下来
* 然后dfs,如果本次新添加在输出数组后面的字符,根据约束不应该放在某个已有字符的后面,那么就中断这条径的dfs就可以了
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char tmp[400];
char output[27];
char v[26];
bool c[26][26];
bool flag[26];
void dfs(int num,int len){
if(num == len){
printf("%s\n",output);
}
else{
for(int i=0;i<strlen(v);++i){
if(!flag[v[i] - 'a']){
flag[v[i] - 'a'] = true;
output[num] = v[i];
//检查顺序要求是否满足
bool validflag = true;
for(int j=0;j<26;++j){
if(flag[j] && c[v[i] - 'a'][j]){
validflag = false;
}
}
if(validflag){
dfs(num+1,len);
}
flag[v[i] - 'a'] = false;
}
}
}
}
int main(){
while(scanf("%[^\n]",tmp)!=EOF){
getchar();
memset(v,0,sizeof(v));
memset(output,0,sizeof(output));
for(int i=0;i<26;++i){
for(int j=0;j<26;++j){
c[i][j] = false;
}
}
int idx = 0;
for(int i=0;i<strlen(tmp);++i){
if(tmp[i]!=' '){
v[idx++] = tmp[i];
}
}
sort(v,v+idx);
scanf("%[^\n]",tmp);
getchar();
idx = 0;
int front,behind;
for(int i=0;i<strlen(tmp);++i){
while(tmp[i] == ' ') ++i;
front = tmp[i++] - 'a';
while(tmp[i] == ' ') ++i;
behind = tmp[i] - 'a';
c[front][behind] = true;
}
dfs(0,strlen(v));
printf("\n");
}
return 0;
}
poj1270 DFS
最新推荐文章于 2017-05-31 11:24:27 发布