poj1270 DFS

来源:互联网 发布:广西公务员网络考试 编辑:程序博客网 时间:2024/06/02 03:45
/** * 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;}


0 0