poj1270 DFS

/**
 * 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值