穷竭搜索之深度优先
深度优先算法(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 }
/**
* 此处只传递思想,程序未经调试
*/
根据深度优先的思想,从第一个查询出来的水开始遍历包含其的水洼,如果递归结束就说明一个水洼被遍历完,就开始进入下一次循环
注:深度优先考虑使用递归会更加简单
以上