HNU软件能力实训2-7. 棋盘

本文介绍了一种使用C++编程解决寻找给定矩阵中最大完整棋盘及其数量的问题。通过深度优先搜索(DFS)算法,对每个矩阵元素进行检查,判断其是否符合棋盘规则。在样例输入中,对于5x5的矩阵,输出的最大棋盘尺寸为3x3,共有3个这样的棋盘。
摘要由CSDN通过智能技术生成

写在前面

你好!欢迎来到我的博客,希望我的思路能够帮到你!

问题描述

棋盘是指一个行和列编号从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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值