搜索下就可以了……
代码如下:
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 }