穷竭搜索之深度优先

深度优先算法(DFS):

深度优先搜索,它从某个状态开始,不断的转移状态直到无法转移,然后回退到前一个状态,继续转移到其他状态,如此不断重复,直到找到最终解。根据深度优先搜索的特点,多采用递归函数来实现深度优先搜索。

(通俗来说就是从一个根节点开始,不断向下转移状态,直到往下再也没有了,就切换另一根节点重复操作)

例子:

question:有一个大小为NxM的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子中总共有多少水洼?(八连通指的是下图中相对W的*的部分)

*  *  *

* W *

*  *  *

limit:N,M<=100

solution code:

 1 class solution{
 2     char[][] garden;
 3     int N,M,count=0;//园子长宽,水洼数量
 4     Scanner s = new Scanner(System.in);//定义扫描器对象
 5     
 6     public void init(){//初始化二维数组garden
 7         System.out.println("请输入园子长(N):");
 8         N = s.nextInt();
 9         System.out.println("请输入园子宽(M):");
10         M = s.nextInt();
11         System.out.println("请依次输入园子组成(输入一行回车一次)————无水部分用'.'表示,反之用'#'表示 ");
12         garden = new char[N][M];
13         for(int i=0;i<M;i++){
14             String temp = s.next();//一次输入一行,回车结束开始下一次循环
15             for(int j=0;j<N;j++){
16                 garden[i][j] = temp.indexOf(j);
17             }
18         }
19         //初始化完毕
20     }
21     
22     public void dfs(int x,int y;){//主体
23         garden[x][y] = '.';
24         for(int dx=-1;dx<=1;dx++){
25             for(int dy=-1;dy<=1;dy++){//双重循环遍历八连通
26                 int nx = x+dx;int ny = y+dy;
27                 if(nx>=0&&nx<N&&ny>=0&&nx<M&&garden[nx][ny].equal('W')){//判断点是否在院子内以及是否是水洼
28                     dfs(nx,ny);//递归来让属于此水洼的所有'W'变为'.'
29                 }
30             }
31         }
32         return;//递归结束语句
33     }
34     
35     public void solve(){//在园子中寻找水洼开始的坐标
36         for(int i=0;i<M;i++){
37             for(int j=0;j<N;j++){
38                 if(garden[i][j].equal('W')){
39                     dfs(i,j);
40                     count++;
41                 }
42             }
43         }
44     }
45     public void main(String[] args){
46         init();
47         solve();
48         System.out.println("此园子里有"+count+"个水洼");
49     }
50 }

/**

  * 此处只传递思想,程序未经调试

  */

根据深度优先的思想,从第一个查询出来的水开始遍历包含其的水洼,如果递归结束就说明一个水洼被遍历完,就开始进入下一次循环

注:深度优先考虑使用递归会更加简单

 

以上

 

posted @ 2018-11-29 11:32  醉生梦死_0423  阅读(231)  评论(0编辑  收藏  举报