电子配件 技术支持 东莞网站建设play商店
您将获得一个 n × n n×n n×n 的网格,网格中每个正方形的颜色为黑色或白色。如果满足以下所有条件,则网格是正确的:
- 每行的黑色方块数与白色方块数相同。
- 每列的黑色正方形数与白色方块数相同。
- 没有行或列具有 3 3 3 个及以上相同颜色的连续正方形。
给定网格,确定它是否正确。
输入格式
第一行一个数字 n n n( 2 ≤ n ≤ 24 2≤n≤24 2≤n≤24), 并且数字 n n n 是偶数。
接下来 n n n 行,每行包含一个长度为 n n n的由字符B
和W
组成的字符串,代表网格正方形的颜色。
输出格式
如果网格正确,请打印数字 1
在一行上。否则,请打印数字 0
在一行上。
样例输入
4
WBBW
WBWB
BWWB
BWBW
样例输出
1
解题思路
关键在于状态的维护
采用三个参数来维护状态:
连续色块颜色,色块连续数,累计黑块数量
第三个参数很好理解,这里只说明前两个参数的使用
读入一个色块,有一下两种情况
(1)与当前连续色块颜色一致:色块连续数++
(2)与当前连续色块颜色不一致:修改当前连续色块颜色,初始化色块连续数为 1 1 1
AC代码如下
#include <iostream>
#include <string>
using namespace std;
const int max_n = 24;int n;
int row_sum, row_seq, row_status = -1;
int col_sum[max_n], col_seq[max_n], col_status[max_n];int main() {for (int i = 0; i < max_n; i++) col_status[i] = -1;cin >> n; cin.ignore();string str;bool ans = true, c;for (int i = 0; i < n; i++) {getline(cin, str);int len = str.size();if (ans) {for (int j = 0; j < len; j++) {if (str[j] == 'B') c = 1;else c = 0;row_sum += c;if (row_status == c) {row_seq++;if (row_seq == 3) {ans = false;break;}}else {row_seq = 1;row_status = c;}col_sum[j] += c;if (col_status[j] == c) {col_seq[j]++;if (col_seq[j] == 3) {ans = false;break;}}else {col_seq[j] = 1;col_status[j] = c;}}if (row_sum != n / 2) ans = false;row_sum = 0;row_seq = 0;row_status = -1;}}if (ans) {for (int i = 0; i < n; i++)if (col_sum[i] != n / 2) {ans = false;break;}}cout << ans << endl;return 0;
}