题意:
n个人,每个人都要与其他人比赛;
a i = 1:所有的比赛都不能输(只能平局或赢)
a i = 2 :所有的比赛至少赢得一场
思路:
对于a i = 1的人来说,可以将他和其他人的比赛都构造成平局
对于a i = 2的人来说,只需要把这些人单独记录下来,每次让他赢得他的下一个人,也就是输给上一个人,这样就能保证赢一局。
要注意如果a i = 1 ∣ ∣ 2的时候,说明无论如何也赢不了,应该输出N O
代码:
int a[110]; char s[110][110]; int main(){ int _=read; while(_--){ int n=read,cnt=0; vector<int>v; map<int,int>mp; for(int i=1;i<=n;i++){ scanf("%1d",&a[i]); if(a[i]==1) cnt++,mp[i]=1; else v.push_back(i); } if(v.size()==2||v.size()==1){ puts("NO");continue; } puts("YES"); int idx=0,m=v.size(); for(int i=1;i<=n;i++){ if(a[i]==1){//如果这个人不能输 for(int j=1;j<=n;j++){ if(i==j) cout<<"X"; else cout<<"=";//所有的都输出平局 if(j==n) puts(""); } } else{ for(int j=1;j<=n;j++){ if(i==j) cout<<"X"; else if(a[j]==1) cout<<"=";//和不能输的人比,都是平局 else if((v[(idx+1)%m])==j) cout<<"+";//一直都是赢下一个 else if(v[(idx-1+m)%m]==j) cout<<"-";//输给上一个 else cout<<"=";//其余都是平局 if(j==n) puts(""),idx++; } } } } return 0; }