写在前面
你好!欢迎来到我的博客,希望我的思路能够帮到你!
问题描述
棋盘是指一个行和列编号从1~N的NxN的二进制矩阵,当行号和列号之和为偶数时该矩阵对应位置为黑色的(1),否则为白色的(0)。以下图示为N=1、2、3时的棋盘。
给出一个NxN的二进制矩阵,请找出位于该矩阵内的最大尺寸的完整棋盘,以及最大尺寸棋盘的数量(棋盘可以交叠)。
输入形式
每个测试用例的第一行是一个正整数N(1<=N<=2000),表示給定矩阵的行数和列数,接下来的N行描述了这个矩阵:每行有N个字符,既可以是“1”(代表黑块),也可以是“0”(代表白块)。矩阵至少包含一个“1”字符。
输出形式
输出最大尺寸棋盘的行列的大小,以及最大棋盘的个数,以空格分隔。
样例输入
5
00101
11010
00101
01010
11101
样例输出
3 3
解题思路
首先是数据处理,这个样例输入相当于是n个字符串,而我们又要提取出中间的所有字符进行判断,所以采用了char的二维数组进行存储。
处理完数据后,对每个元素调用dfs函数,得到答案。接下来是dfs函数思想的解释。
在每次调用时,我们设置棋盘大小为1,若当前唯一的一个棋盘是白色,即为 ‘0’ 时,return返回上一层,说明这个棋盘不符合题意。
当前位置加上棋盘的大小大于输入时的棋盘大小时,也不存在这样的棋盘,return返回上一层。
然后从左上角开始,对当前大小的棋盘进行遍历,当行与列的和为偶数且棋盘为白色时,不符合题意,return;当行与列的和为奇数且棋盘的颜色是黑色时,不符合题意,return。
若以上限制条件都没能时函数return,说明当前参数情况下(棋盘的左上角是 (m,n) ,棋盘大小为depth)的棋盘是符合题意的,如果大于我们设置的最大大小,更新最大大小;将符合题意的当前大小的 (depth) 棋盘的计数器++;并递归的调用左上角是 (m,n) 的更大一层的dfs函数。
AC代码
#include<iostream>
using namespace std;
const int N=2010;
char chessboard[N][N];
//储存输入的棋盘
int chessbo