【网易2017春招】涂棋盘 解题报告

标签(空格分隔): 牛客网


题目地址:​​https://www.nowcoder.com/questionTerminal/79ed2f61eef7448aab10ef9677382e7e?orderByHotValue=0&questionTypes=000100&page=1&onlyReference=false​

题目描述:

小易有一块n*n的棋盘,棋盘的每一个格子都为黑色或者白色,小易现在要用他喜欢的红色去涂画棋盘。小易会找出棋盘中某一列中拥有相同颜色的最大的区域去涂画,帮助小易算算他会涂画多少个棋格。


输入:

输入数据包括n+1行:

第一行为一个整数n(1 ≤ n ≤ 50),即棋盘的大小

接下来的n行每行一个字符串表示第i行棋盘的颜色,’W’表示白色,’B’表示黑色

输出:

输出小易会涂画的区域大小

样例输入:

3
BWW
BBB
BWB

样例输出:

3

Ways

这个题我提交了很多次。错误的原因是想着总想统计每一列的出现的W和B的次数,这样有点鸡肋,而且麻烦。

新方法就是只用一个col输出保存每列的出现的最大连续字符的次数即可,也就是动态规划。

三重循环,第一重是对列,第二重是对行,第三重是对以后的行。这样即可保证对于列的每行的某个元素都会遍历到以后的出现的连续次数,保存最大连续次数。

当第三重循环里面的判断条件即当前测试值和判断值不同时,注意判断下是否满足DP的条件,另外吧两个统计用的变量归位。因为count统计的是连续字符数,因此初始值为1.

还出现错误的一个地方就是,如果每列的最后一个元素统计结束时,第三重循环会结束,这样就没有保存的了最后的连续结果。解决方法是在循环结束后,再手动计算一次。

#include <stdio.h>
#include <string.h>

int main() {
int n;
while (scanf("%d", &n) != EOF) {
char bricks[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
char temp;
scanf("%c", &temp);
if (temp == '\n') {
scanf("%c", &bricks[i][j]);
} else {
bricks[i][j] = temp;
}

}
}
int col[n];
memset(col, 0, sizeof(col));
for (int j = 0; j < n; j++) {
for (int i = 0; i < n; i++) {
char temp = bricks[i][j];
int count = 1;
for (int k = i + 1; k < n; k++) {
if (bricks[k][j] == temp) {
count++;
} else {
if (col[j] < count) {
col[j] = count;
}
temp = bricks[k][j];
count = 1;
}
}
if (col[j] < count) {
col[j] = count;
}
}
}
int answer = 0;
for (int i = 0; i < n; i++) {
if (answer < col[i]) {
answer = col[i];
}
}
printf("%d\n", answer);
}
return 0;
}

Date

2017 年 3 月 29 日