当前位置:   article > 正文

[走迷宫上瘾]关于迷宫问题与深搜的爱恨情仇_洛谷b3936

洛谷b3936

千万不要一看标题就觉得我们今天是来玩游戏的,只是因为深搜算法的题目,十道里有七道都是关于迷宫的。(请计算概率)

告诉大家深搜(dfs)和广搜(bfs)的区别:

深搜是一条路干到底,广搜是多点开花(通俗易懂)

 不废话了上题目吧

 一:OpenJudge   2.5基本算法之搜索----2753走迷宫

OpenJudge - 2753:走迷宫

这题刚AC,代码还热乎着呢(这又什么神奇脑回路!)

AC代码:

  1. #include<iostream>
  2. using namespace std;
  3. int r,c,a[105][105],minn=10000000000,sum=1,x,y;
  4. char b[105][105];
  5. void fun(int x,int y)
  6. {
  7. if(x==r&&y==c)
  8. {
  9. if(sum<minn)
  10. {
  11. minn=sum;
  12. }
  13. return;
  14. }
  15. if(b[x][y]==0||a[x][y]==1||b[x][y]=='#')
  16. {
  17. return;
  18. }
  19. else
  20. {
  21. a[x][y]=1;
  22. sum++;
  23. fun(x+1,y);
  24. fun(x,y+1);
  25. fun(x-1,y);
  26. fun(x,y-1);
  27. a[x][y]=0;
  28. sum--;
  29. }
  30. return;
  31. }
  32. int main()
  33. {
  34. int i,j;
  35. cin>>r>>c;
  36. for(i=1;i<=r;i++)
  37. {
  38. for(j=1;j<=c;j++)
  39. {
  40. cin>>b[i][j];
  41. }
  42. }
  43. fun(1,1);
  44. cout<<minn;
  45. return 0;
  46. }

说实话OpenJudge里还有一道题可以拿深搜做,TA就是

OpenJudge - 1700:八皇后问题

啊没错就是八皇后。 

题解我已经写过了,大家可以查看:题解之八皇后问题-CSDN博客

  

二:洛谷B3625 迷宫寻路

迷宫寻路 - 洛谷

这题很基础但很重要

核心代码:

#include<iostream>
using namespace std;
int x,y,n,m,d[105][105];  //定义所需数组变量 
char o[105][105];
void fun(int x,int y)  //直接输出用void 
{
    if(x==n&&y==m)  //是否到达终点 
    {
        cout<<"Yes";   //成功的输出 
        exit(0);   //结束全部 
    }
    if(o[x][y]=='#'||o[x][y]==0||d[x][y]==1)   
     //失败的情况 :o[x][y]=='#'是当前是墙壁,o[x][y]==0是越界,d[x][y]==1是已经走过了被标记了 
    {
        return;  //返回上一层 
    }
    else
    {
        d[x][y]=1;   //标记已经走过了 
        //四个方向搜索 
        fun(x+1,y);
        fun(x,y+1);
        fun(x-1,y);
        fun(x,y-1);
    }
    return;   //返回上一层 
}
int main()
{
    int i,j;   //不在函数中使用就在主函数里定义 
    //输入 
    cin>>n>>m;  
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            cin>>o[i][j];
        }
    }
    fun(1,1);  //使用函数 
    cout<<"No";  //失败的输出
    return 0;  //结束 
}

AC代码:

  1. #include<iostream>
  2. using namespace std;
  3. int x,y,n,m,d[105][105];
  4. char o[105][105];
  5. void fun(int x,int y)
  6. {
  7. if(x==n&&y==m)
  8. {
  9. cout<<"Yes";
  10. exit(0);
  11. }
  12. if(o[x][y]=='#'||o[x][y]==0||d[x][y]==1)
  13. {
  14. return;
  15. }
  16. else
  17. {
  18. d[x][y]=1;
  19. fun(x+1,y);
  20. fun(x,y+1);
  21. fun(x-1,y);
  22. fun(x,y-1);
  23. }
  24. return;
  25. }
  26. int main()
  27. {
  28. int i,j;
  29. cin>>n>>m;
  30. for(i=1;i<=n;i++)
  31. {
  32. for(j=1;j<=m;j++)
  33. {
  34. cin>>o[i][j];
  35. }
  36. }
  37. fun(1,1);
  38. cout<<"No";
  39. return 0;
  40. }

这段代码理解透彻做其他迷宫问题就比较容易了。 

三:洛谷P1605 迷宫

迷宫 - 洛谷

AC代码

  1. #include<iostream>
  2. using namespace std;
  3. int sx,sy,fx,fy,n,m,t,l[105][105],i,j,d[105][105],sum;
  4. char o[105][105];
  5. void fun(int x,int y)
  6. {
  7. if(x==fx&&y==fy)
  8. {
  9. sum++;
  10. return;
  11. }
  12. if(o[x][y]==0||o[x][y]=='*'||d[x][y]==1)
  13. {
  14. return;
  15. }
  16. else
  17. {
  18. d[x][y]=1;
  19. fun(x,y+1);
  20. fun(x+1,y);
  21. fun(x,y-1);
  22. fun(x-1,y);
  23. d[x][y]=0;
  24. }
  25. return;
  26. }
  27. int main()
  28. {
  29. int k,r,e;
  30. cin>>n>>m>>t;
  31. cin>>sx>>sy>>fx>>fy;
  32. for(i=1;i<=t;i++)
  33. {
  34. cin>>e>>r;
  35. o[e][r]='*';
  36. }
  37. for(i=1;i<=n;i++)
  38. {
  39. for(j=1;j<=m;j++)
  40. {
  41. if(o[i][j]!='*')
  42. {
  43. o[i][j]='!';
  44. }
  45. }
  46. }
  47. if(o[fx][fy]=='*')
  48. {
  49. cout<<0;
  50. return 0;
  51. }
  52. fun(sx,sy);
  53. cout<<sum;
  54. return 0;
  55. }

先转化成char类型的迷宫再做。 

接下来两道题的题目在这个网站查看:

青少年软件编程(C语言五级)等级考试真题试卷(2022年6月) | 考级竞赛题库

四,逃离迷宫 

AC代码

  1. #include<iostream>
  2. using namespace std;
  3. int t,m,k,x,y,minute,f[105][105],flag;
  4. char a[105][105];
  5. void fun(int x,int y)
  6. {
  7. if(a[x][y]=='E'&&minute<=t)
  8. {
  9. flag=1;
  10. return;
  11. }
  12. if(a[x][y]==0||a[x][y]=='#'||minute>t||f[x][y]==1)
  13. {
  14. return;
  15. }
  16. else
  17. {
  18. f[x][y]=1;
  19. minute++;
  20. fun(x+1,y);
  21. fun(x,y+1);
  22. fun(x-1,y);
  23. fun(x,y-1);
  24. f[x][y]=0;
  25. minute--;
  26. }
  27. }
  28. int main()
  29. {
  30. int i,j,qx,qy;
  31. cin>>k;
  32. while(k--)
  33. {
  34. flag=0;
  35. cin>>m>>t;
  36. for(i=1;i<=m;i++)
  37. {
  38. for(j=1;j<=m;j++)
  39. {
  40. cin>>a[i][j];
  41. if(a[i][j]=='S')
  42. {
  43. qx=i;
  44. qy=j;
  45. }
  46. }
  47. }
  48. fun(qx,qy);
  49. if(flag==1)
  50. {
  51. cout<<"YES"<<endl;
  52. }
  53. else
  54. {
  55. cout<<"NO"<<endl;
  56. }
  57. }
  58. return 0;
  59. }

五,夺宝探险

AC代码

  1. #include<iostream>
  2. using namespace std;
  3. int a[105][105],f[105],x,y,t,maxx;
  4. int m,n,k,sum=0;
  5. void fun(int x,int y)
  6. {
  7. t=a[x][y];
  8. int q,w;
  9. if(a[x][y]==0||f[a[x][y]]==1)
  10. {
  11. maxx=max(maxx,sum);
  12. }
  13. else
  14. {
  15. f[a[x][y]]=1;
  16. sum++;
  17. fun(x+1,y);
  18. fun(x,y+1);
  19. fun(x-1,y);
  20. fun(x,y-1);
  21. f[a[x][y]]=0;
  22. sum--;
  23. }
  24. }
  25. int main()
  26. {
  27. int i,j,o;
  28. cin>>m>>n>>k;
  29. for(i=1;i<=m;i++)
  30. {
  31. for(j=1;j<=n;j++)
  32. {
  33. cin>>a[i][j];
  34. }
  35. }
  36. fun(1,1);
  37. cout<<maxx;
  38. }

可以用桶排的思想去做。

总结

 判断失败与成功的情况,标记,朝几个方向搜索,还原现场。

就按这个思路来,肯定没问题。

结束!

祝大家学算法都能听懂,写代码都能AC。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/931752
推荐阅读
相关标签
  

闽ICP备14008679号