搜索算法之深度优先搜索和广度优先搜索

梦里梦外; 2022-06-01 06:36 579阅读 0赞

所谓深度优先搜索:就是一条道走到黑,不碰南墙不回头的那种。

  1. 广度优先搜索:就是从你所站的位置向周围扩散性的搜索,通俗来讲,就是你在黑夜里眼睛掉了,你肯定是趴在地上,手向四周摸索,摸不到会到下一步摸索。

一道简单的例题的两种不同的做法:

问题描述:(自己编的大笑,绝对原创),小明和女神小红一起出去游玩,偶然发现一座上古迷宫(里面可能有科学不能解释的神奇物品),好奇心特别重的小红想着里面有能让自己变漂亮的神奇药水(女生都比较爱美),于是想进去寻找,小明也想进去保护女神,但是俩人带了超多的东西,小红执意让他留下来看东西,自己一人前往。可是路痴的她没走多久就迷路了,又怕黑的她向小明求救,(假如可以听的到),小明为救女神肯定要走最短的路径,但是该如何走呢?

输入:

数据的第一行给你两个数:n,m,(0<n,m<100)表示迷宫的长和宽,然后输入迷宫,接下来是迷宫的入口和此时女神所在的位置,小明在迷宫内只能上下左右移动。

输出:解救女神的最小步数。

样例1:

  1. 输入:7 7
  2. 1 0 1 1 1 1 1
  3. 1 0 1 0 0 0 0
  4. 1 0 0 0 0 0 1
  5. 1 0 0 0 1 0 1
  6. 1 1 0 0 0 0 1
  7. 1 1 0 1 0 1 1
  8. 1 1 1 1 1 1 1
  9. 0 1 5 4
  10. 输出:8

样例2:

  1. 输入:
  2. 5 4
  3. 0 0 1 0
  4. 0 0 0 0
  5. 0 0 1 0
  6. 0 1 0 0
  7. 0 0 0 1
  8. 0 0 3 2
  9. 输出:7

自己瞎编的一道题,用不同的方法做的,学了好久的搜索,其中队列总是不会,然后通过两种不同的做法来完成这道题

代码1:深度优先搜索

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. #define min(a,b)a>b?b:a;
  7. using namespace std;
  8. int m,n,st_x,st_y,end_x,end_y,ans;//分别为迷宫的起点和终点
  9. int migong[101][101];//定义一个迷宫地图
  10. void dfs(int x,int y,int s)//用s表示当前所走的路
  11. {
  12. if(x<0||y<0||x>=m||y>=n||migong[x][y])//如果出界或遇到墙则返回
  13. return;
  14. if(x==end_x&&y==end_y)//到达目的地搜索结束
  15. {
  16. ans=min(ans,s);
  17. return ;
  18. }
  19. s++;
  20. migong[x][y]=1;//走过的路变为墙,防止重复走
  21. dfs(x+1,y,s);//四个方向进行搜索
  22. dfs(x-1,y,s);
  23. dfs(x,y+1,s);
  24. dfs(x,y-1,s);
  25. migong[x][y]=0;//变为原来的样子
  26. }
  27. int main()
  28. {
  29. while(scanf("%d%d",&m,&n)!=EOF)
  30. {
  31. int i,j;
  32. for(i=0; i<m; i++)
  33. {
  34. for(j=0; j<n; j++)
  35. {
  36. scanf("%d",&migong[i][j]);
  37. }
  38. }
  39. scanf("%d%d%d%d",&st_x,&st_y,&end_x,&end_y);
  40. ans=n*m;//走的步数最多为n*m
  41. dfs(st_x,st_y,0);
  42. printf("%d\n",ans);
  43. }
  44. return 0;
  45. }

代码2:广度优先搜索

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #include<math.h>
  5. #include<stdlib.h>
  6. #include<algorithm>
  7. using namespace std;
  8. int n,m,st_x,st_y,end_x,end_y;
  9. int map[101][101];
  10. int mark[101][101];//标记地图
  11. int move_x[4]= {0,0,1,-1};//四个移动方向
  12. int move_y[4]= {1,-1,0,0};
  13. struct node//定义一个队列结构体
  14. {
  15. int x,y,step;
  16. } a,next;
  17. int check(int x,int y)//判断是否能通过
  18. {
  19. if(x<0||y<0||x>=m||y>=n||mark[x][y]||map[x][y])
  20. return 1;
  21. else
  22. return 0;
  23. }
  24. int bfs()
  25. {
  26. int i;
  27. queue<node>Q;//创建一个队列
  28. a.x=st_x;
  29. a.y=st_y;
  30. a.step=0;
  31. mark[st_x][st_y]=1;
  32. Q.push(a);//向队列中添加一个元素a
  33. while(!Q.empty())//队列为空则返回真,非空返回假
  34. {
  35. a=Q.front();//返回队列里的头部元素
  36. Q.pop();// 删除队列的第一个元素
  37. if(a.x==end_x&&a.y==end_y)
  38. return a.step;
  39. for(i=0; i<4; i++)
  40. {
  41. next.x=a.x+move_x[i];
  42. next.y=a.y+move_y[i];
  43. if(check(next.x,next.y))
  44. continue;
  45. else
  46. next.step=a.step+1;
  47. Q.push(next);
  48. }
  49. }
  50. return 0;
  51. }
  52. int main()
  53. {
  54. while(scanf("%d%d",&m,&n)!=EOF)
  55. {
  56. int i,j,ans;
  57. memset(mark,0,sizeof(mark));
  58. for(i=0; i<m; i++)
  59. {
  60. for(j=0; j<n; j++)
  61. {
  62. scanf("%d",&map[i][j]);
  63. }
  64. }
  65. scanf("%d%d%d%d",&st_x,&st_y,&end_x,&end_y);
  66. ans=bfs();
  67. printf("%d\n",ans);
  68. }
  69. }

发表评论

表情:
评论列表 (有 0 条评论,579人围观)

还没有评论,来说两句吧...

相关阅读

    相关 深度优先搜索广度优先搜索

    算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。