一开始想复杂了,然后写了一大堆代码,其实2的情况是判一下四个角,再判一下每一行每一列即可
/* 结果必定<=4 0:所有人都是A 1:边界一整行都是A 2:非边界一整行/列都是A, 角落是A 3:剩余情况 4:A被P包围 不可能:都是P */ #include<bits/stdc++.h> using namespace std; #define N 105 int r,c; char mp[N][N]; int main(){ int t;cin>>t;while(t--){ cin>>r>>c; int flag1=0,flag2=0; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++){ cin>>mp[i][j]; if(mp[i][j]=='P')flag1=1; if(mp[i][j]=='A')flag2=1; } if(!flag1){cout<<0<<' ';continue;} if(!flag2){cout<<"MORTAL"<<' ';continue;} //1 int f=0; for(int i=1;i<=r;i++)if(mp[i][1]=='P')f=1; if(!f){puts("1");continue;} f=0; for(int i=1;i<=r;i++)if(mp[i][c]=='P')f=1; if(!f){puts("1");continue;} f=0; for(int i=1;i<=c;i++)if(mp[1][i]=='P')f=1; if(!f){puts("1");continue;} f=0; for(int i=1;i<=c;i++)if(mp[r][i]=='P')f=1; if(!f){puts("1");continue;} //2 if(mp[1][1]=='A' || mp[1][c]=='A' || mp[r][1]=='A' || mp[r][c]=='A'){ puts("2");continue; } f=0; for(int i=1;i<=r;i++){ int flag=0; for(int j=1;j<=c;j++)if(mp[i][j]=='P')flag=1; if(!flag)f=1; } if(f){puts("2");continue;} f=0; for(int i=1;i<=c;i++){ int flag=0; for(int j=1;j<=r;j++)if(mp[j][i]=='P')flag=1; if(!flag)f=1; } if(f){puts("2");continue;} //3 f=0; for(int i=1;i<=r;i++) if(mp[i][1]=='A' || mp[i][c]=='A')f=1; for(int i=1;i<=c;i++) if(mp[1][i]=='A' || mp[r][i]=='A')f=1; if(f){puts("3");continue;} puts("4"); memset(mp,0,sizeof mp); } }