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; }