刚开始的思路很沙雕,写了一百多行宣布失败
- 其实发现只需要判断一个1的右面和下面是否都是0就够了
随意证明:
对于除了最右列和最下行的元素,其他的1,如果它合理,那么它的右面或者下面一定有相邻的,这样就可以一直推下去,直到到达边界。
也就是说,对于一个不合理的1,它的右面和下面肯定是0,因为如果为1,这个1就是合理的了,与假设相矛盾。
So,只要存在一个1它的右面和下面都是0,那么就不成立,反之成立
#include <bits/stdc++.h>
using namespace std;
string str[55];
void solve(){
int n;
cin >> n;
for(int i = 0; i < n; i ++)
cin >> str[i];
for(int i = 0; i < n - 1; i ++){
for(int j = 0; j < n - 1; j ++){
if(str[i][j] == '1' && str[i + 1][j]== '0' && str[i][j + 1] == '0'){
cout << "NO" << endl;
return;
}
}
}
cout << "YES" << endl;
}
int main(){
int t;
cin >> t;
while(t --){
solve();
}
return 0;
}