链接
题解
如果全是 ,答案为 ,否则:
如果某条边线都是 ,答案为 ,否则:
如果某个角落是 或者某行全是 或者某列全是 ,答案为 ,否则:
只要边线上有 ,答案是 ,否则:
只要有 ,答案是 ,否则无解
代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(_,__) for(_=1;_<=(__);_++)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{
ll c, f(1);
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-0x30;
return f*x;
}
char s[100][100];
ll r, c;
pair<ll,ll> q(ll r1, ll c1, ll r2, ll c2)
{
ll i, j, a(0), p(0);
for(i=r1;i<=r2;i++)for(j=c1;j<=c2;j++)
if(s[i][j]=='A')a++;
else p++;
return pll(a,p);
}
int main()
{
ll T=read(), i, j;
while(T--)
{
ll r=read(), c=read();
rep(i,r)scanf("%s",s[i]+1);
if(q(1,1,r,c) == pll(r*c,0)) //全A
{
printf("0\n");
}
else if( q(1,1,1,c)==pll(c,0) or q(r,1,r,c)==pll(c,0) or q(1,1,r,1)==pll(r,0) or q(1,c,r,c)==pll(r,0))
printf("1\n");
else
{
bool ok = false;
if(s[1][1]=='A' or s[1][c]=='A' or s[r][1]=='A' or s[r][c]=='A')ok=true; //四个角落
for(i=1;i<=r;i++)if(q(i,1,i,c)==pll(c,0))ok=true;
for(j=1;j<=c;j++)if(q(1,j,r,j)==pll(r,0))ok=true; //某条中间的线全A
if(ok)
{
printf("2\n");
}
else
{
//边线上有A
if( q(1,1,1,c)!=pll(0,c) or q(r,1,r,c)!=pll(0,c) or q(1,1,r,1)!=pll(0,r) or q(1,c,r,c)!=pll(0,r))
printf("3\n");
else
{
if( q(1,1,r,c) != pll(0,r*c) )
printf("4\n");
else
{
printf("MORTAL\n");
}
}
}
}
}
return 0;
}