#include using namespace std; const int N = 110; //注意:n,m一定要声明在全局变量区!!!!因为check() 函数需要读取它的内容!!! int n, m; int a[N][N]; /* 测试用例: 3 1 4 0110 5 5 00000 01100 01100 00001 01100 5 5 00000 01100 01110 00001 01100 */ bool check() { //0:白 1:黑 if (n < 4 || m < 4 ) //不足4行4列,直接判定不可以,这步容易遗漏 return false; int s1 = 0, s4 = 0; for (int i = 1; i <= 4; i++) { s1 += a[1][i];//第一行的和 s4 += a[4][i];//第四行的和 } if (s1 || s4)//如果第一行或第四行不全是白色 return false; //第2行,第3行 if (a[2][1] || a[2][4])//(2,1),(2,4)如果是黑色, //判定不可以,注意:这里要写不可以的,保留最后的就是可以的 return false; if (!a[2][2] || !a[2][3]) return false; if (a[3][1] || a[3][4]) return false; if (!a[3][2] || !a[3][3]) return false; return true; } int main() { int T; cin >> T; while (T--) { cin >> n >> m; for (int i = 1; i <= n; i++) { string s;//因为01中间无空格,使用string进行读取,再分拆到数组a[N][N]中 cin >> s; for (int j = 1; j <= m; j++) a[i][j] = s[j - 1] - '0';//要注意string下标是从0开始的,这里j需要减1 } if (check()) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }