Daimayuan Online Judge-网格判断
题目描述
您将获得一个 \(n×n\) 的网格,网格中每个正方形的颜色为黑色或白色。如果满足以下所有条件,则网格是正确的:
-
每行的黑色方块数与白色方块数相同。
-
每列的黑色正方形数与白色方块数相同。
-
没有行或列具有 \(3\) 个及以上相同颜色的连续正方形。
给定网格,确定它是否正确。
输入格式
第一行一个数字 \(n\)。
接下来 \(n\) 行,每行包含一个长度为 \(n\) 的由字符B
和W
组成的字符串,代表网格正方形的颜色。
输出格式
如果网格正确,请打印数字 \(1\) 在一行上。否则,请打印数字 \(0\) 在一行上。
样例输入
4
WBBW
WBWB
BWWB
BWBW
样例输出
1
数据范围
\(2≤n≤24\),且 \(n\) 是偶数。
解题思路
数据范围不大,模拟即可。分别枚举行和列,判断每一行或列中的W
和B
个数是否相等,不相等直接输出 \(0\),程序结束。同时在判断每一行或列中的W
和B
个数是否相等的同时,设一个变量 \(cnt\),用于记录连续个数,只要当前字符和前一个字符相同,就进行加一,大于等于 \(3\) 直接跳出循环,输出 \(0\) 即可,否则重新设置为 \(1\)。
C++代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 30;
int n;
char g[N][N];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n;
for(int i = 1; i <= n; i ++)
cin >> g[i] + 1;
for(int i = 1; i <= n; i ++)
{
int cb = 0, cw = 0;
int cnt = 1;
for(int j = 1; j <= n; j ++)
{
if(j > 1)
{
if(g[i][j] == g[i][j - 1]) cnt ++;
else cnt = 1;
}
if(cnt >= 3) break;
if(g[i][j] == 'B') cb ++;
else cw ++;
}
if(cb != cw || cnt >= 3)
{
puts("0");
return 0;
}
}
for(int i = 1; i <= n; i ++)
{
int cb = 0, cw = 0;
int cnt = 1;
for(int j = 1; j <= n; j ++)
{
if(j > 1)
{
if(g[j][i] == g[j - 1][i]) cnt ++;
else cnt = 1;
}
if(cnt >= 3) break;
if(g[j][i] == 'B') cb ++;
else cw ++;
}
if(cb != cw || cnt >= 3)
{
puts("0");
return 0;
}
}
puts("1");
return 0;
}
标签:cnt,++,cb,每日,网格,int,cw,2022.11
From: https://www.cnblogs.com/Cocoicobird/p/16853562.html