Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55883
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-16 22:03
个人简介

Small thing follow your head, big thing follow your heart.

文章分类

全部博文(9)

文章存档

2015年(4)

2014年(5)

我的朋友

分类: C/C++

2014-10-30 19:54:46

深度优先搜索:

个人理解:从第一个开始搜索,搜索其全部方向。若在搜索其中某个方向时有符合条件的元素,就以此元素再进行递归,递归时把该元素置为不符合条件,然 后又在搜索其全部方向。。。直到所有元素都遍历完。【两个for循环,一个是用于遍历所有元素,另一个遍历某个元素的所有方向】

(和广度优先搜索一样围绕某个元素遍历其所有方向,不同在于,深度优先会在发现符合条件的元素时,递归调用,层层深入,无法深入再进行下一个方向;广度则无论有无符合条件的元素,都进行下一个方向)

特点:采用递归,比较简练。

应用:(暂时不了解)


例题:(POJ  No.2386)

有一个大小为N*M的园子,雨后积起水来,八连通(八个方向)的积水被认为是连接在一起的.请求出园子里总共有多少水洼?(*表示八连通,W表示积水)

***

*w*

***


代码:(来自<挑战程序设计竞赛>p33)

点击(此处)折叠或打开

  1. void solve()
  2.     {
  3.         int res = 0;
  4.         int i = 0;
  5.         int j = 0;
  6.       
  7.         for (i = 0; i < N; i++)
  8.         {
  9.             for (j = 0; j < M; j++)
  10.             {
  11.                 if (field[i][j] == 'w')
  12.                 {
  13.                     dfs(i, j);
  14.                     res++;
  15.                 }
  16.             }
  17.         }
  18.       
  19.         printf("有%d个水洼!\n", res);
  20.     }
  21.       
  22.     void dfs(int x, int y)
  23.     {
  24.         int dx = 0;
  25.         int dy = 0;
  26.         int nx = 0;
  27.         int ny = 0;
  28.       
  29.         field[x][y] = '.';
  30.           
  31.         for (dx = -1; dx < 2; dx++)
  32.         {
  33.             for (dy = -1; dy < 2; dy++)
  34.             {
  35.                 nx = x + dx;
  36.                 ny = y + dy;
  37.       
  38.                 if ((nx >= 0) && (nx < N) && (ny >= 0) && (ny < M)
  39.                         &&(field[nx][ny] == 'w'))
  40.                 {
  41.                     dfs(nx, ny);
  42.                 }
  43.             }
  44.         }
  45.     }


阅读(1787) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~