linkk
题意:
个人,每个人都要与其他人比赛;
:所有的比赛都不能输(只能平局或赢)
所有的比赛至少赢得一场
思路:
对于的人来说,可以将他和其他人的比赛都构造成平局
对于的人来说,只需要把这些人单独记录下来,每次让他赢得他的下一个人,也就是输给上一个人,这样就能保证赢一局。
要注意如果的时候,说明无论如何也赢不了,应该输出
代码:
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;
}