深度优先解决水洼问题
有一个大小为 NM 的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对 W 的 的部分)
***
*W*
***
限制条件:N, M ≤ 100
样例输入:
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
这个问题解决,通过一个点判断是不是W,如果是那么就走8个角的点进行一步一步的判断,避免重复判断,把走过的并且是W的点变成"."就可以避免了。
上代码
import java. util. Scanner;
public class 水洼问题 {
public static void main ( String[ ] args) {
Scanner sc = new Scanner ( System. in) ;
int n = sc. nextInt ( ) ;
int m = sc. nextInt ( ) ;
char a[ ] [ ] = new char [ n] [ ] ;
for ( int i = 0 ; i < n; i++ ) {
a[ i] = sc. next ( ) . toCharArray ( ) ;
}
int sum = 0 ;
for ( int i = 0 ; i < n; i++ ) {
for ( int j = 0 ; j < m; j++ ) {
if ( a[ i] [ j] == 'W' ) {
dfs ( a, i, j) ;
sum++ ;
}
}
}
System. out. println ( sum) ;
}
private static void dfs ( char [ ] [ ] a, int i, int j) {
a[ i] [ j] = '.' ;
if ( i > 0 && a[ i- 1 ] [ j] == 'W' ) dfs ( a, i- 1 , j) ;
if ( i < a. length- 1 && a[ i+ 1 ] [ j] == 'W' ) dfs ( a, i+ 1 , j) ;
if ( j > 0 && a[ i] [ j- 1 ] == 'W' ) dfs ( a, i, j- 1 ) ;
if ( j < a[ i] . length- 1 && a[ i] [ j+ 1 ] == 'W' ) dfs ( a, i, j+ 1 ) ;
if ( i> 0 && j> 0 && a[ i- 1 ] [ j- 1 ] == 'W' ) dfs ( a, i- 1 , j- 1 ) ;
if ( i< a. length- 1 && j> 0 && a[ i+ 1 ] [ j- 1 ] == 'W' ) dfs ( a, i+ 1 , j- 1 ) ;
if ( i> 0 && j< a[ i] . length- 1 && a[ i- 1 ] [ j+ 1 ] == 'W' ) dfs ( a, i- 1 , j+ 1 ) ;
if ( i< a. length- 1 && j< a[ i] . length- 1 && a[ i+ 1 ] [ j+ 1 ] == 'W' ) dfs ( a, i+ 1 , j+ 1 ) ;
}
}