一、内容
题意:只能选择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;
}