Codeforces Round #607 (Div. 2) D Beingawesomeism

题目链接:https://codeforces.com/contest/1281/problem/D

题意:可以选择1*X和X*1的格子(X为任意值),向任意方向复制任意步,如下图,选择PPAP向上两步,将APPP和PAAA都变成了PPAP。

问将全图变成A需要多少步。

思路:显然只有0,1,2,3,4,impossible六种情况

impossible:全P

0步:全A

1步:第一行、最后一行、第一列、最后一列有全A

2步:中间行有全A、中间列有全A、四角有A

3步:不满足上述情况下,第一行、最后一行、第一列、最后一列有A

4步:上述情况全不满足

#include<bits/stdc++.h>
using namespace std;
const int maxn=65;
char g[maxn][maxn];
int r,c,row[maxn],col[maxn];//col行 row列
void solve()
{
    memset(row,0,sizeof row);
    memset(col,0,sizeof col);
    int sum=0;
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
        {
            if(g[i][j]=='A')col[i]++,row[j]++,sum++; 
        }
    }
    if(sum==0)printf("MORTAL\n");
    else if(sum==r*c)printf("0\n");
    else if(row[1]==r||row[c]==r||col[1]==c||col[r]==c)printf("1\n");
    else 
    {
        int flag=0;
        for(int i=2;i<r;i++)if(col[i]==c)flag=1;
        for(int i=2;i<c;i++)if(row[i]==r)flag=1;
        if(flag==1||g[1][1]=='A'||g[r][1]=='A'||g[1][c]=='A'||g[r][c]=='A')printf("2\n");
        else if(row[1]>0||row[c]>0||col[1]>0||col[r]>0)printf("3\n");
        else printf("4\n");
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&r,&c);
        for(int i=1;i<=r;i++)scanf("%s",g[i]+1);
        solve();
    }
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/myrtle/p/12077870.html