题意:这个题。。。仔细看题容易崩溃,建议还是直接看样例?样例其实也并不难猜它在干嘛。好吧,言归正传,其实就是给你个nm的矩阵,矩阵有A和P两个字符,你每次操作可以选择一块连续的1x大小的只含A字符的矩阵,(x的大小随意,不超过矩阵大小就行)扫任意方向,在你扫过的路径的字符都会变成A,问你把整个矩阵的字符都变成A的最小操作数。
思路:其实答案只有6个:0,1,2,3,4,没有。所以分类讨论就行。
代码有点丑,其实有几行都是没有的(QAQ)。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e2+1;
char a[maxn][maxn];
int r[maxn],c[maxn];//r是行,c是列
int main()
{
int T,n,m,flag,flag1,flag2,left,right,up,down;
scanf("%d",&T);
while(T--)
{
flag2=flag1=left=right=up=down=flag=0;
memset(r,0,sizeof(r));
memset(c,0,sizeof(c));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%s",a[i]+1);
for(int j=1;j<=m;++j)
{
r[i]+=(a[i][j]=='A');
c[j]+=(a[i][j]=='A');
if(i==1) up+=(a[i][j]=='A');
if(i==n) down+=(a[i][j]=='A');
if(j==1) left+=(a[i][j]=='A');
if(j==m) right+=(a[i][j]=='A');
if(a[i][j]=='A') flag=1;
if(a[i][j]=='P') flag1=1;
}
}
if(!flag1){
printf("0\n");continue;
}
if(!flag) {
printf("MORTAL\n");continue;
}
if(left==n||right==n||up==m||down==m)
{
printf("1\n");continue;
}
for(int i=1;i<=n;++i)
{
if(r[i]==m) {
flag2=1;break;
}
}
for(int i=1;i<=m;++i)
{
if(c[i]==n)
{
flag2=1;break;
}
}
if(a[1][1]=='A'||a[1][m]=='A'||a[n][1]=='A'||a[n][m]=='A'||flag2){
printf("2\n");continue;
}
if(left>0||right>0||up>0||down>0)
{
printf("3\n");continue;
}
printf("4\n");
}
}