二维数组覆盖
题目链接:https://codeforces.com/contest/1280/problem/B
#include<iostream> #include<cstring> #define int long long using namespace std; const int N = 65; int rt[N],ct[N],t,r,c; char g[N][N]; /* 题意:只能选择1x X 或者 X * 1的格子,可以上下左右移动任意步,将全图变成A需要多少次操作. 输出MORTAL:当全部为P时 输出0:当全部为A时 输出1:第1行或第r行或第1列或第c列全为A 输出2:四角有一个为A 或者 第二行至倒数第二行有一行全为A 或 第二列至倒数第列行有一列全为A 输出3:在不满足上述条件下,第一行或最后一行或第一列或最后一列有一个为A即可 输出4:上述都不满足。 */ 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++; rt[i]++; ct[j]++; } } } 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; } signed main() { int t; cin >> t; while(t--) { cin >> r >> c; for(int i = 1;i <= r;i++) cin >> g[i] + 1; int sol = solve(); if(sol == -1) cout << "MORTAL" << endl; else cout << sol << endl; } return 0; }
思路与代码来源:https://blog.csdn.net/qq_41280600/article/details/103604769
致千里!