http://acm.hdu.edu.cn/showproblem.php?pid=4068
暴力枚举两个全排列,犯了若干错误,以此为鉴
#include <iostream> #include <cstdio> #include <cstring> #include <map> using namespace std ; int n,f,m[10],vis[10],vis2[10],temp[10] ; string str[10],ans[10],s[10][10],res[10] ; int OK() { int i,j,flag ; i=j=0 ; while(i<n && j<n) { flag=0 ; for(int k=0 ;k<m[temp[i]] ;k++) { if(s[temp[i]][k]==res[j]) { flag=1 ; break ; } } if(flag)j++ ; else i++ ; } if(i==n)return 1 ; return 0 ; } int ff ; int dfs2(int cur) { if(cur==n) { if(!OK()){ ff=0 ; return 0 ; } } for(int i=0 ;i<n && ff ;i++) { if(!vis2[i]) { vis2[i]=1 ; temp[cur]=i ; dfs2(cur+1) ; vis2[i]=0 ; } } if(ff)return 1 ; return 0 ; } void dfs(int cur) { if(f) return ; if(cur==n) { ff=1 ; memset(vis2,0,sizeof(vis2)) ; if(dfs2(0)) { f=1 ; for(int i=0 ;i<n ;i++) ans[i]=res[i] ; } return ; } for(int i=0 ;i<n ;i++) { if(!vis[i]) { vis[i]=1 ; res[cur]=str[i] ; dfs(cur+1) ; vis[i]=0 ; } } } int main() { int t ; scanf("%d",&t) ; for(int cas=1 ;cas<=t ;cas++) { scanf("%d",&n) ; for(int i=0 ;i<n ;i++) cin >> str[i] ; for(int i=0 ;i<n ;i++) { scanf("%d",&m[i]) ; for(int j=0 ;j<m[i] ;j++) { cin >> s[i][j] ; } } sort(str,str+n) ; f=0 ; memset(vis,0,sizeof(vis)) ; dfs(0) ; printf("Case %d: ",cas) ; if(f) { puts("Yes") ; for(int i=0 ;i<n ;i++) { if(i) { putchar(' ') ; } cout << ans[i] ; } putchar('\n') ; } else puts("No") ; } return 0 ; }