本题需要一定的思考量。
对于位于(x,y)的一黑色,无论如何换,它的相对位置总不会发生变化,也就是不会有两个(x,y)位置的黑色
那么如果我们想让对角线上布满黑色,就可以将题目转化为
判断是否有n个满足横纵坐标互不相同的黑色
二分图匹配即可。
Code
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<cstdio> #include<cstring> using namespace std; const int N=20000; int ans,n,num_bian,nxt[N<<1],to[N<<1],head[N],vis[N],match[N]; void add(int x,int y){ nxt[++num_bian]=head[x],head[x]=num_bian,to[num_bian]=y; } bool dfs(int x){ for(int i=head[x],y;i;i=nxt[i]) if(!vis[y=to[i]]){ vis[y]=1; if(!match[y]||dfs(match[y])){match[y]=x;return true;} } return false; } void work(){ scanf("%d",&n); num_bian=0;ans=0; memset(head,0,sizeof(head)); memset(match,0,sizeof(match)); for(int i=1;i<=n;++i) for(int j=1,x;j<=n;++j){ scanf("%d",&x); if(x)add(i,j); } for(int i=1;i<=n;++i){ memset(vis,0,sizeof(vis)); if(dfs(i))ans++; } if(ans==n)puts("Yes"); else puts("No"); } int main(){ int T;scanf("%d",&T); while(T--)work(); return 0; }