二维数组覆盖

题目链接:https://codeforces.com/contest/1280/problem/B

#include<iostream>
#include<cstring>
#define int long long
using namespace std;
const int N = 65;
int rt[N],ct[N],t,r,c;
char g[N][N];

/*
题意:只能选择1x X 或者 X * 1的格子,可以上下左右移动任意步,将全图变成A需要多少次操作.

输出MORTAL:当全部为P时
输出0:当全部为A时
输出1:第1行或第r行或第1列或第c列全为A
输出2:四角有一个为A 或者 第二行至倒数第二行有一行全为A 或 第二列至倒数第列行有一列全为A
输出3:在不满足上述条件下,第一行或最后一行或第一列或最后一列有一个为A即可
输出4:上述都不满足。
*/

int solve()
{
    memset(rt,0,sizeof(rt));
    memset(ct,0,sizeof(ct));
    int sum = 0;
    for(int i = 1;i <= r;i++)
    {    
        for(int j = 1;j <= c;j++)
        {
            if(g[i][j] == 'A')
            {
                sum++;
                rt[i]++;
                ct[j]++;
            }
        }
    }
    if(sum == 0)
        return -1;
    if(sum == r * c)
        return 0;
    if(rt[1] == c || rt[r] == c || ct[1] == r || ct[c] == r)
        return 1;
    if(g[1][1] == 'A' || g[1][c] == 'A' || g[r][1] == 'A' || g[r][c] == 'A')
        return 2;
    for(int i = 2;i <= r;i++)
        if(rt[i] == c)
            return 2;
    for(int i = 2;i <= c;i++)
        if(ct[i] == r)
            return 2;
    if(rt[1] || rt[r] || ct[1] || ct[c])
        return 3;
    return 4;
}

signed main()
{
    int t;
    cin >> t;
    while(t--)
    {
        cin >> r >> c;
        for(int i = 1;i <= r;i++)
            cin >> g[i] + 1;
        int sol = solve();
        if(sol == -1)
            cout << "MORTAL" << endl;
        else
            cout << sol << endl;
    }
    return 0;
}

思路与代码来源:https://blog.csdn.net/qq_41280600/article/details/103604769

posted @ 2019-12-25 19:57  恶魔岛  阅读(342)  评论(0编辑  收藏  举报