网易2017春招笔试真题编程题集合——9.涂棋盘
题目:
小易有一块n*n的棋盘,棋盘的每一个格子都为黑色或者白色,小易现在要用他喜欢的红色去涂画棋盘。小易会找出棋盘中某一列中拥有相同颜色的最大的区域去涂画,帮助小易算算他会涂画多少个棋格。
原题地址在这里:牛客网
输入描述:
- 输入数据包括n+1行:
- 第一行为一个整数n(1 ≤ n ≤ 50),即棋盘的大小
- 接下来的n行每行一个字符串表示第i行棋盘的颜色,'W'表示白色,'B'表示黑色
输出描述:
输出小易会涂画的区域大小
输入例子:
3 BWW BBB BWB
输出例子
3
用java编写,思路是这样的:
1 使用java.util.Scanner
接收控制台输入 2 定义两个变量int iw,ib
和一个数组int[] maxs
:
iw
用于累加当前列 W 连续出现的次数ib
用于累加当前列 B 连续出现的次数maxs
数组用于记录每一列出现的拥有相同颜色的最大的区域(即在一列中出现 连续的相同颜色的单元格 的最大个数)- 遍历(双层循环)保存了W/B的二维数组,在内层循环里判断当前 单元格 的值是 W 还是 B ,是 W 的话:
- 先 让负责记录当前列中 W 连续出现次数的 iw 自增1
- **后 判断用于记录当前列出现 “拥有相同颜色的最大的区域” 的 maxs[i]的值是否小于此时的 iw ,是则把 iw 的值赋给他,否则不改变他的值 **
- 最后 让负责记录当前列中 B 连续出现次数的 ib 置为0,因为此时遇到了 W ,即 B 不连续了,被 W 打断了
- 遇到 B 也是同样的操作:ib 自增1,判断当前的 maxs[i] ,把 iw 置为0;
- 注意在开始遍历每一列前(外层循环内)要把 iw , ib ,maxs[i]置为0;
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
if (!(n >= 1 && n <= 50))
return;
in.nextLine();
char[][] res = new char[n][n];
for (int i = 0; i < n; i++) {
String str = in.nextLine();
for (int j = 0; j < n; j++) {
res[i][j] = str.charAt(j);
}
}
int iw = 0, ib = 0;
int[] maxs= new int[n];
for (int i = 0; i < n; i++) {
maxs[i] = 0;
iw = ib = 0;
for (int j = 0; j < n; j++) {
if (res[j][i] == 'W') {
iw++;
maxs[i] = iw > maxs[i] ? iw : maxs[i];
ib = 0;
} else {
ib++;
maxs[i] = ib > maxs[i] ? ib : maxs[i];
iw = 0;
}
}
}
Arrays.sort(maxs);
System.out.println(""+maxs[maxs.length - 1]);
}
}
复制代码
提交运行 之后就会提示通过所有测试用例:
注意点:
- 在使用 Scanner 接收控制台输入时先调用了
int nextInt()
方法,程序运行到该句时会阻塞,等待控制台输入并按回车,之后该方法就会返回输入的 int 值,别忘了此时还有一个 回车符 没有被解析,先要调用String nextLine()
把 回车符 消耗掉,否则在之后调用String nextLine()
获取输入的 W/B 时会出错。 - 调用
Arrays
类的void sort(int[] a)
方法对maxs
数组进行排序(升序),输出maxs[maxs.length - 1]
即为所求。