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
原文地址:https://www.cnblogs.com/xin-hua/p/3292434.html