编程语言
首页 > 编程语言> > (2021-5)搜索类题目(bfs dfs)-计算水洼数量 c++

(2021-5)搜索类题目(bfs dfs)-计算水洼数量 c++

作者:互联网

题目描述

题目:有一块N*M的土地,下雨后积起了雨水,有水的区域标记为"w",干燥标记为".",8连通区域被认为是连接在一起的;请求出院子里有多少水洼?

input

w w w . 
. . . .
. . w w
w w . .

output

2

思路:

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

struct node{
	int x, y;
}Node;

int num = 0;
char plot[4][4]; //存放地图
int vis[4][4]; // 标记是否访问过
int dir[8][2] = {{0,1},{0,-1},{1,0},{-1,0},{-1,1},{-1,-1},{1,1},{1,-1}}; //8个方向


void bfs(int x, int y){
	queue <node> Q;
	Node.x = x;
	Node.y = y;
	Q.push(Node);
	while(!Q.empty()){
		Node = Q.front();
		Q.pop();
		for(int i=0; i<8; i++){
			int newX = Node.x + dir[i][0];
			int newY = Node.y + dir[i][1];
			if(newX>=0 && newX <4 && newY>=0 && newY<4 && plot[newX][newY] =='w' && !vis[newX][newY]){
				Node.x = newX;
				Node.y = newY;
				Q.push(Node);
				vis[newX][newY] = true;
			}
		}
	}
}

void dfs(int x, int y){
	vis[x][y] = true;
	for(int i=0; i<8; i++){
		int newX = x + dir[i][0];
		int newY = y + dir[i][1];
		if(newX>=0 && newX <4 && newY>=0 && newY<4 && plot[newX][newY] =='w' && !vis[newX][newY]){
			dfs(newX, newY);
		}
	}
}

int main(){
	memset(vis, 0, sizeof(vis));
	for(int i=0; i<4; i++){
		for(int j=0; j<4; j++){
			cin >> plot[i][j];
		}
	} //数组初始化

	for(int i=0; i<4; i++){
		for(int j=0; j<4; j++){
			if(plot[i][j] == '.' || vis[i][j]) continue; //如果元素被访问过或者位干燥区域,则直接过滤掉
			bfs(i, j);
			num++;
		}
	}
	printf("%d\n", num);
	return 0;
}

运行结果
在这里插入图片描述

标签:Node,int,dfs,bfs,vis,newX,newY,c++,dir
来源: https://blog.csdn.net/Claming_D/article/details/116607207