拍的太慢了,很不满意
排完序之后,枚举自己和对手状态,若被击败,则再枚举自己下一个策略,直到可以击败对手所有的策略
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 const int INF=0x3f3f3f3f; const double eps=1e-5; typedef long long ll; #define cl(a) memset(a,0,sizeof(a)) #define ts printf("***** "); const int MAXN=1005; int n,m,tt; int g[15][15]; int a1[15]={0,1,2,3,4,5,6}; int a2[15]={0,1,2,3,4,5,6}; bool check() { int t1=0; int t2=0; bool flag=0; while(1) { if(g[a2[t2]][a1[t1]]) { t1++; } else t2++; if(t1==n) { flag=0; break; } if(t2==n) { flag=1; break; } } if(!flag) return 0; else return 1; } int main() { int i,j,k,ca=1; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif scanf("%d",&tt); while(tt--) { printf("Case %d: ",ca++); map<string,int> mp1; map<int,string> mp2; scanf("%d",&n); string s[15]; for(i=0;i<n;i++) { cin>>s[i]; } sort(s,s+n); for(i=0;i<n;i++) { mp1[s[i]]=i; mp2[i]=s[i]; } cl(g); string sw; for(i=0;i<n;i++) { int num; scanf("%d",&num); for(j=0;j<num;j++) { cin>>sw; int v=mp1[sw]; g[i][v]=1; //有克制关系 } } for(i=0;i<15;i++) a1[i]=i,a2[i]=i; bool flag=1; bool w=0; while(1) { flag=1; while(1) { if(!check()) //该策略被击败 { flag=0; } if(!next_permutation(a2,a2+n)) break; } if(flag) { w=1; break; } if(!next_permutation(a1,a1+n)) break; } if(w) { printf("Yes "); cout<<mp2[a1[0]]; for(i=1;i<n;i++) { cout<<" "<<mp2[a1[i]]; } printf(" "); } else { printf("No "); } } }