cf1280B——分类讨论+模拟

一开始想复杂了,然后写了一大堆代码,其实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<<'\n';continue;}
        if(!flag2){cout<<"MORTAL"<<'\n';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);
    }
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12109172.html
今日推荐