zoukankan      html  css  js  c++  java
  • BZOJ 1059 矩阵游戏

    Description

    小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个(N imes N)黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵的任意行列,交换这两列(即交换对应格子的颜色)游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小Q决定写一个程序来判断这些关卡是否有解。

    Input

    第一行包含一个整数(T),表示数据的组数。接下来包含(T)组数据,每组数据第一行为一个整数(N),表示方阵的大小;接下来N行为一个(N imes 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

    HINT

    对于100%的数据,N ≤ 200

    一个结论题。若两个点的横或纵坐标相同,不论怎么交换,相同的仍然相同。若不同,仍然不同。
    因此可以用二分图最大匹配,匹配横纵坐标(若该点为1,横坐标向纵坐标连条边),若为完备匹配,输出Yes,否则No。

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    using namespace std;
    
    #define maxn 210
    int n,s[maxn][maxn],mat[maxn];
    bool used[maxn];
    
    inline int find(int x)
    {
    	for (int i = 1;i <= n;++i)
    		if (s[x][i] && !used[i])
    		{
    			used[i] = true;
    			if (!mat[i]||find(mat[i])) { mat[i] = x; return true; }
    		}
    	return false;
    }
    
    inline int hungry()
    {
    	int ret = 0; memset(mat,0,4*(n+1));
    	for (int i = 1;i <= n;++i)
    	{
    		memset(used,false,n+1);
    		if (find(i)) ++ret;
    	}
    	return ret;
    }
    
    int main()
    {
    	freopen("1059.in","r",stdin);
    	freopen("1059.out","w",stdout);
    	int T; scanf("%d",&T);
    	while (T--)
    	{
    		scanf("%d",&n);
    		for (int i = 1;i <= n;++i)
    			for (int j = 1;j <= n;++j) scanf("%d",s[i]+j);
    		if (hungry() == n) puts("Yes"); else puts("No");
    	}
    	fclose(stdin); fclose(stdout);
    	return 0;
    }
    
    
  • 相关阅读:
    mysql数据库常用指令
    解决windows的mysql无法启动 服务没有报告任何错误的经验。
    “Can't open file for writing”或“operation not permitted”的解决办法
    启动Apache出现错误Port 80 in use by "Unable to open process" with PID 4!
    如何打开windows的服务services.msc
    常见的HTTP状态码 404 500 301 200
    linux系统常用的重启、关机指令
    (wifi)wifi移植之命令行调试driver和supplicant
    linux(debian)安装USB无线网卡(tp-link TL-WN725N rtl8188eu )
    alloc_chrdev_region申请一个动态主设备号,并申请一系列次设备号
  • 原文地址:https://www.cnblogs.com/mmlz/p/4297953.html
Copyright © 2011-2022 走看看