Polygon

传送门




刚开始的思路很沙雕,写了一百多行宣布失败

  • 其实发现只需要判断一个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;
}
原文地址:https://www.cnblogs.com/pureayu/p/14413525.html