CF1365A 题解

Luogu-CF1365A

题目分析

如果当前玩家想要在网格图上找一个位置设置为 \(1\),条件式这一个位置所在的行以及列上都没有其它的 \(1\)

观察到数据范围只有 $1 \leq n,m \leq 50 $,我们可以考虑直接在网格图上操作。

在读入的时候,只要读入到当前位置的数为 \(1\),我们可以在网格图上将该行和该列上的所有数都标记为 \(1\)

之后我们可以模拟玩家操作的过程,记录下当前回合谁在操作。每次遍历一遍网格图,如果发现网格图中有 \(0\),就把这个位置变为 \(1\),并且将该行和该列上的每一个数都变为 \(1\)

以此不断循环,直到遍历网格图时没有 \(0\),就说明一个玩家要输了,此时输出当前不是谁在操作即可。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;

ll n, T, m;
bool a[100][100], ok = 0;

void change(ll x, ll y){ 
    for (int i = 1; i <= n; ++i) a[i][y] = 1;
    for (int j = 1; j <= m; ++j) a[x][j] = 1;
} //将该位置的每一行和每一列都该为1

void CLEAR(){ 
    ok = 0;
    memset(a, 0, sizeof a);
} //初始化

int main()
{
    T = read();
    while (T--)
    {
        CLEAR(); //初始化
        n = read(), m = read();
        for (int i = 1; i <= n; ++i){
            for (int j = 1; j <= m; ++j){
                bool x;
                cin >> x;
                if (x == 1)
                    change(i, j); //修改
            }
        }

        while (1)
        {
            bool f = 0; //为遍历表之后没有找到0而弹出做准备
            for (int i = 1; i <= n; ++i){
                for (int j = 1; j <= m; ++j){
                    if (a[i][j] == 0){
                        change(i, j);
                        if (ok == 0) ok = 1; //更换谁在操作
                        else ok = 0; //更换谁在操作
                        f = 1; //代表找到了0
                        break;
                    }
                }
                if (f == 1)
                    break;
            }
            if (f == 0){ //表里全是1,输出答案
                if (ok == 0) puts("Vivek");
                else puts("Ashish");
                break;
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/EdisonBa/p/14702154.html