Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55730
  • 博文数量: 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 20:18:35

个人理解:从某元素开始搜索,搜索该元素的所有方向,把符合条件的方向的元素"入队"...然后从队列中取出一个元素,对这个元素进行全方向搜索,,符合条件的加入队列..........直到符合结束条件或者队空.

应用:常用于最短路径问题,,


例题;(迷宫的最短路径问题):
给定一个大小为N*M的迷宫,迷宫由通道和墙壁组成, 每步可以向相邻的的上下左右四个通道移动, 请求出从起点到终点所需的最小步数.(假定从起点一定可以到终点)<限制:N, M <= 100>


点击(此处)折叠或打开

  1. const int INF = 100000000;            /*int类型可以那么大吗?*/
  2. typedef pair<int, int> p;
  3. char maze[MAX_N][MAX_M + 1];
  4. int N;
  5. int M;
  6. int sx;                                /*起始坐标*/
  7. int sy;
  8. int gx;                                /*终点坐标*/
  9. int gy;

  10. int d[MAX_N][MAX_M];

  11. int dx[4] = {1, 0, -1, 0};                /*右下左上,
  12. int dy[4] = {0, 1, 0, -1};                

  13. int bfs()
  14. {
  15.     int nx = 0;
  16.     int ny = 0;
  17.     queue<p> que;                        /*p是前面的pair类型*/
  18.     
  19.     for (int i = 0; i < N; i++)
  20.     {
  21.         for(int j = 0; j < M; j++)
  22.         {
  23.             d[i][j] = INF;
  24.         }
  25.     }
  26.     que.push(p(sx, sy));
  27.     d[sx][sy] = 0;

  28.     while (que.size())
  29.     {
  30.         p pp = que.front();                /*查看最前面那个数, p为pair类型*/
  31.         que.pop();                        /*清除最前面那个数(
  32.         
  33.         if (pp.first == gx && pp.second == gy)
  34.         {
  35.             break;                                /*到达终点*/
  36.         }

  37.         for (int i = 0; i < 4; i++)
  38.         {
  39.             nx = pp.first + dx[i];
  40.             ny = pp.second + dy[i];

  41.             if ((0 <= nx && nx < N) && (0 <= ny && ny < M) && maze[nx][ny] != '#' && d[nx][ny] == INF)            /*不为#(), 且没有访问过*/
  42.             {
  43.                 que.push(p(nx, ny));            /*入队*/
  44.                 d[nx][ny] = d[pp.first][pp.second] + 1;
  45.             }
  46.         }
  47.     }

  48.     return d[gx][gy];
  49. }

  50. void solve()
  51. {
  52.     int res = bfs();
  53.     printf("最短路径为:%d\n", res);
  54. }


结果:



<<每周一算法,健康中国人---------------------------初代.>>

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