深度优先算法(DFS)(一般用个伪递归,这样可以更方便地回溯):
是遍历自己所能到达的地方,能到达就走,直到不能走的时候,进行回溯,然后继续进行遍历(每走一步,标记自己所走的路)。(SummerII E,G,H题)
这里附上一题:
Gdufe_2018_Summer II(E)
Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.
Given a diagram of Farmer John's field, determine how many ponds he has.
Input
* Line 1: Two space-separated integers: N and M
* Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.
Output
* Line 1: The number of ponds in Farmer John's field.
Sample Input
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
Sample Output
3
Hint
OUTPUT DETAILS:
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
题解:一个非常常规的深度优先搜索。传说中的小岛题,W是陆地(往附近的8个方向搜索,是同一个小岛),一共问有多少个小岛。
import java.util.Scanner;
public class Main {
static Scanner scan = new Scanner(System.in);
static char[][] arr = new char[105][105];
static char text = 'W';
public static void main(String[] args) {
// TODO Auto-generated method stub
while(scan.hasNext()){
int N = scan.nextInt();
int M = scan.nextInt();
char[] arr1 = new char[M];
int ans = 0;
for(int i=0;i<N;i++){
String str = scan.next();
arr1 = str.toCharArray();
for(int j=0;j<M;j++){
arr[i][j] = arr1[j];
}
}
for(int i=0;i<N;i++)
for(int j=0;j<M;j++){
if(arr[i][j]=='W'){
ans++;
arr[i][j] = '.';
bfs(i,j,N,M);
}
}
System.out.println(ans);
}
}
private static void bfs( int i, int j,int N,int M) {
// TODO Auto-generated method stub
arr[i][j] = '.';
for(int a=-1;a<=1;a++) //上下左右,左上下,右上下,一个点搜索8个方向,
for(int b=-1;b<=1;b++){
int i1=i+a;int j1=j+b; //搜索的点,判断是否符合条件,注意原来的i和j是不能改变的,因为要保证能搜索完这8个方向。
if(i1>=0&&j1>=0&&i1<N&&j1<M&&arr[i1][j1]==text){
// i=i+a;j=j+b;
bfs(i1,j1,N,M); //对满足条件的点进行深搜
}
}
}
}