深度优先搜索的用法——lake counting

深度优先搜索的用法——lake counting

问题主题:Lake Counting

问题描述:

有一个大小为N*M的园子,雨后积了很多水。八连通的积水被认为是在一起的。请求出园子里共有多少个水洼?(八连通是指下图中相对+*部分)

+++

+*+

+++

限制条件:

N,M <= 100

样例:

输入

N=10, M=12

园子如下图(‘+’表示积水,’*’表示没有积水)

+********++*

*+++*****+++

****++***++*

*********++*

*********+**

**+******+**

*+*+*****++*

+*+*+*****+*

*+*+******+*

**+*******+*

输出

3

 

 

【解法一】

解题分析:

    从任意的’+’开始,不停地把邻接的部分用’*’代替,一次dfs(深度优先遍历)遍历后,与初始的这个+所连接的所有+都会被替换成*,因此直到图中没有+为止,总共进行dfs的次数即为积水的次数。

程序实现:

 

C++

 

#include "iostream"

 

using namespace std;

 

const int N = 10;

const int M = 12;

 

char garden[N][M+1] = {

"+********++*",

"*+++*****+++",

"****++***++*",

"*********++*",

"*********+**",

"**+******+**",

"*+*+*****++*",

"+*+*+*****+*",

"*+*+******+*",

"**+*******+*"

};

 

void dfs(int x, int y);

 

void solve() {

int count = 0;

for(int j=0; j

for(int i=0; i

if(garden[j][i] == '+') {

dfs(j, i);

count ++;

}

}

}

cout << count << endl;

}

 

void dfs(int y, int x) {

garden[y][x] = '*';

for(int dy=y-1; dy<=y+1; dy++) {

for(int dx=x-1; dx<=x+1; dx++) {

if(dx >=0 && dy >= 0 && dx < M && dy < N && garden[dy][dx] == '+') {

dfs(dy, dx);

}

}

}

}

 

int main() {

solve();

return 0;

}

 

Java

/**
 * User: luoweifu
 * Date: 14-1-7
 * Time: 下午4:53
 */
public class LakeCounting {
public static final int N = 10;
public static final int M = 12;
private String garden[] = {
"+********++*",
"*+++*****+++",
"****++***++*",
"*********++*",
"*********+**",
"**+******+**",
"*+*+*****++*",
"+*+*+*****+*",
"*+*+******+*",
"**+*******+*"
};
 
public void solve() {
int count = 0;
for(int j=0; j=0 && dy >= 0 && dx < M && dy < N && garden[dy].charAt(dx) == '+') {
dfs(dy, dx);
}
}
}
}
 
public static void main(String args[]) {
LakeCounting lakeCounting = new LakeCounting();
lakeCounting.solve();
}
}

 

 

你可能感兴趣的:(程序设计,算法程序设计)