Codeforces Round #607 (Div. 2) D - Beingawesomeism (思维)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题意:这个题。。。仔细看题容易崩溃,建议还是直接看样例?样例其实也并不难猜它在干嘛。好吧,言归正传,其实就是给你个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");
	}
}
发布了39 篇原创文章 · 获赞 0 · 访问量 1063

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104083576