Beingawesomeism CodeForces - 1281D

一、内容

题意:只能选择1x X 或者 X * 1的格子,可以上下左右移动任意步,将全图变成A需要多少次操作.

二、思路

  • 输出MORTAL:当全部为P时
  • 输出0:当全部为A时
  • 输出1:第1行或第r行或第1列或第c列全为A
  • 输出2:四角有一个为A 或者 第二行至倒数第二行有一行全为A 或 第二列至倒数第列行有一列全为A
  • 输出3:在不满足上述条件下,第一行或最后一行或第一列或最后一列有一个为A即可
  • 输出4:上述都不满足。

三、代码

#include <cstdio>
#include <cstring>
using namespace std;
const int N = 65;
int rt[N], ct[N], t, r, c;
char g[N][N];
int solve() {
	memset(rt, 0, sizeof(rt));
	memset(ct, 0, sizeof(ct));
	int sum = 0;
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			if (g[i][j] == 'A') sum++, ct[j]++, rt[i]++; 
		}
	} 
	if (sum == 0) return -1;
	if (sum == r * c) return 0;
	if (rt[1] == c || rt[r] == c || ct[1] == r || ct[c] == r) return 1;
	if (g[1][1] == 'A' || g[1][c] == 'A' || g[r][1] == 'A' || g[r][c] == 'A') return 2;
	for (int i = 2; i <= r; i++) if (rt[i] == c) return 2;
	for (int i = 2; i <= c; i++) if (ct[i] == r) return 2; 
	if (rt[1] || rt[r] || ct[1] || ct[c]) return 3;
	return 4;
}
int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &r, &c);
		for (int i = 1; i <= r; i++) scanf("%s", g[i] + 1);
		int sol = solve();
		if (sol == -1) printf("MORTAL\n");
		else printf("%d\n", sol);
	}
	return 0;
}
发布了343 篇原创文章 · 获赞 244 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41280600/article/details/103604769
今日推荐