BZOJ1059矩阵游戏
2016-01-17 08:54
204 查看
1059: [ZJOI2007]矩阵游戏
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3040 Solved: 1477
[Submit][Status][Discuss]
Description
小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵的任意行列,交换这两列(即交换对应格子的颜色)游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小Q决定写一个程序来判断这些关卡是否有解。
Input
第一行包含一个整数T,表示数据的组数。接下来包含T组数据,每组数据第一行为一个整数N,表示方阵的大小;接下来N行为一个N*N的01矩阵(0表示白色,1表示黑色)。
Output
输出文件应包含T行。对于每一组数据,如果该关卡有解,输出一行Yes;否则输出一行No。
Sample Input
2
2
0 0
0 1
3
0 0 1
0 1 0
1 0 0
Sample Output
No
Yes
【数据规模】
对于100%的数据,N ≤ 200
二分图匹配裸题。。
矩阵数为1时,f[i][j]=1,然后跑一遍二分图匹配就出来了。。
附上本蒟蒻的代码:
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3040 Solved: 1477
[Submit][Status][Discuss]
Description
小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵的任意行列,交换这两列(即交换对应格子的颜色)游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小Q决定写一个程序来判断这些关卡是否有解。
Input
第一行包含一个整数T,表示数据的组数。接下来包含T组数据,每组数据第一行为一个整数N,表示方阵的大小;接下来N行为一个N*N的01矩阵(0表示白色,1表示黑色)。
Output
输出文件应包含T行。对于每一组数据,如果该关卡有解,输出一行Yes;否则输出一行No。
Sample Input
2
2
0 0
0 1
3
0 0 1
0 1 0
1 0 0
Sample Output
No
Yes
【数据规模】
对于100%的数据,N ≤ 200
二分图匹配裸题。。
矩阵数为1时,f[i][j]=1,然后跑一遍二分图匹配就出来了。。
附上本蒟蒻的代码:
#include<cstdio> #include<cstring> using namespace std; int f[201][201],part[201],n; bool used[201]; int read() { int w=0,c=1; char ch=getchar(); while (ch<'0' || ch>'9') { if (ch=='-') c=-1; ch=getchar(); } while (ch>='0' && ch<='9') { w=w*10+ch-'0'; ch=getchar(); } return w*c; } bool find(int s) { int k; for (k=1;k<=n;k++) if (f[s][k] && !used[k]) { used[k]=true; if (!part[k] || find(part[k])) { part[k]=s; return true; } } return false; } int main() { int t,i,j,x,ans; t=read(); while (t--) { n=read(); memset(f,0,sizeof(f)); memset(part,0,sizeof(part)); for (i=1;i<=n;i++) for (j=1;j<=n;j++) { x=read(); if (x) f[i][j]=1; } ans=0; for (i=1;i<=n;i++) { memset(used,false,sizeof(used)); if (find(i)) ans++; } if (ans==n) printf("%s\n","Yes"); else printf("%s\n","No"); } return 0; }
相关文章推荐
- php环境搭建
- eclipse+android环境搭建
- 无向连通图求割点和桥
- Android在浏览器启动APP
- 来吧
- 从框架到完整项目搭建,实战项目《约个球》(2)-框架搭建之使用CrashHandler来获取应用的Crash信息
- 【NCL】绘制河流的简易方法
- javascript实现的一个信息提示的小功能/
- Zend Studio12的安装破解注册教程
- [bzoj3992][SDOI2015]序列统计
- Linux下,任务计划-crontab
- 混合图的欧拉回路
- Android5.0+(CoordinatorLayout)
- 双击事件和三击事件
- Myeclipse8.5安装教程
- VxWorks Fuzzing 之道:VxWorks 工控实时操作系统漏洞挖掘调试与利用揭秘
- 广搜二
- 【HTML/XML 10】XML文档中的Schema文件
- 【HTML/XML 10】XML文档中的Schema文件
- Linux养成计划:文件搜索命令