题目:有一块N*M的土地,下雨后积起了雨水,有水的区域标记为"w",干燥标记为".",8连通区域被认为是连接在一起的;请求出院子里有多少水洼?
input
w w w . . . . . . . w w w w . .
output
2
思路:
'w'
进行一次搜索;搜索完毕后被搜索的'w'
所在的连通区域都被标记为访问过代码如下:
#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; }
运行结果