题目描述
著名设计师小蓝给蓝桥小学设计了一个教学楼。
蓝桥小学经常下雨,所以校长希望教学楼任何地方都可以连通到其它地方。
小蓝给出了教学楼的平面图,用一个 n 行 m 列的 01 矩阵表示,其中 0 表示空地,1 表示教学楼。
两个相邻的 1 (上下相邻或左右相邻)之间互相可达。
请帮小蓝检查一下,是否教学楼的任意两个地方都可以连通到其它地方。
输入描述
输入的第一行包含两个整数 n,m,用一个空格分隔。
接下来 n 行,每行一个长度为 m 的 01 串,表示教学楼的平面图。
输出描述
如果满足要求,输出“YES”,否则输出“NO”,请注意字母全部都是大写。
输入输出样例
示例1
输入:
5 6
111111
110011
011000
001111
111000
输出:
YES
示例2
输入:
3 4
1111
1101
1010
输出:
NO
评测用例规模与约定
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码:
#include <iostream>
#include <string.h>
using namespace std;
int n, m, cnt = 0, total = 0; //n m 代表行列 cnt 已经统计过是1的地方 total总共是1的地方
string str[500]; //开一个字符串数组 存地图
bool bl[500][500]; //开一个二维bool数组 存是否访问过 true是已经访问 false是未访问
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
void dfs(int x, int y){ //深度递归
bl[x][y] = true; //首先这里已经开始访问此地点 故设为已访问 同时cnt加一
cnt++;
for(int d = 0; d < 4; d++){ //利用方向数组遍历四周的地点是否符合规则
int nx = x + dx[d];
int ny = y + dy[d]; //规则:未超过边界 ,本身为 1 , 未被访问过
if(nx >= 0 && ny < m && str[nx][ny] == '1' && !bl[nx][ny]){
dfs(nx,ny); //符合规则 进入下一个递归
}
}
}
int main(){
cin >> n >> m;
for(int i = 0; i < n; i++) //输入地图
{
cin >> str[i];
for(int j = 0; j < m; j++){
if(str[i][j] == '1') total++; //顺便统计地图中为1的元素个数
}
}
for(int i = 0; i < n; i++){ //遍历地图
for(int j = 0; j < m; j++){
if(str[i][j] == '1'){ //判断为1的进入 深度递归
dfs(i,j);
if(cnt == total) cout << "YES" << endl; //如果统计过的1和总数相等说明yes 反之
else cout << "NO" << endl;
return 0; //无论输出 yes or no 都是结束程序
}
}
}
return 0;
}
代码如上,本道题考察了递归和深度搜索的应用。