hdu 4068 SanguoSHA

搜索下就可以了……

代码如下:

 

  1 #include<iostream>

  2 #include<cstring>

  3 #include<cstdio>

  4 #include<algorithm>

  5 #include<map>

  6 using namespace std;

  7 int p[10][10],n,a[7],b[7];

  8 string str[10],s;

  9 bool flag,vis[10],vis2[10];

 10 bool dfs2(int d)

 11 {

 12     int i,j;

 13     if(d==n){

 14         i=j=0;

 15         while(i<n&&j<n){

 16             bool f=0;

 17             for(int k=1;k<=p[b[j]][0];k++)

 18             if(p[b[j]][k]==a[i]){

 19                 f=1;

 20                 break;

 21             }

 22             if(f) i++;

 23             else j++;

 24         }

 25         if(i==n) return 0;

 26         return 1;

 27     }

 28     for(i=0;i<n;i++){

 29         if(vis2[i]==0){

 30             vis2[i]=1;

 31             b[d]=i;

 32             if(!dfs2(d+1)) return 0;

 33             vis2[i]=0;

 34         }

 35     }

 36     return 1;

 37 }

 38 bool dfs(int d)

 39 {

 40     int i,j;

 41     if(d==n){

 42         flag=0;

 43         for(i=0;i<n;i++){

 44             memset(vis2,0,sizeof(vis2));

 45             b[0]=i;

 46             vis2[i]=1;

 47             if(!dfs2(1)){

 48                 flag=1;

 49                 break;

 50             }

 51         }

 52         if(flag) return 0;

 53         return 1;

 54     }

 55     for(i=0;i<n;i++){

 56         if(vis[i]==0){

 57             vis[i]=1;

 58             a[d]=i;

 59             if(dfs(d+1)) return 1;

 60             vis[i]=0;

 61         }

 62     }

 63 }

 64 int main()

 65 {

 66     int t,i,j,k,ca=0;

 67     cin>>t;

 68     while(t--){

 69         cin>>n;

 70         for(i=0;i<n;i++)

 71             cin>>str[i];

 72         sort(str,str+n);

 73         for(i=0;i<n;i++){

 74             cin>>p[i][0];

 75             for(j=1;j<=p[i][0];j++){

 76                 cin>>s;

 77                 for(k=0;k<n;k++){

 78                     if(s==str[k]){

 79                         p[i][j]=k;

 80                         break;

 81                     }

 82                 }

 83             }

 84         }

 85         for(i=0;i<n;i++){

 86             memset(vis,0,sizeof(vis));

 87             vis[i]=1;

 88             a[0]=i;

 89             if(dfs(1)){

 90                 break;

 91             }

 92         }

 93         printf("Case %d: ",++ca);

 94         if(i==n) puts("No");

 95         else{

 96             puts("Yes");

 97             for(i=0;i<n-1;i++)

 98                 cout<<str[a[i]]<<' ';

 99             cout<<str[a[i]]<<endl;

100         }

101     }

102     return 0;

103 }
View Code

 

 

 

你可能感兴趣的:(HDU)