• 栈实现深度优先搜索


    引言

    之前刚学DFS的时候并不完全理解为什么递归可以一直往下做,后来直到了递归的本质是栈,就想着能不能手写栈来代替递归呢。当时刚学,自己觉得水平不够就搁置了这个想法,今天上数据结构老师正好讲了栈的应用,其中就有一个走迷宫问题,于是写下这篇文章,希望能帮助大家更好的理解DFS。

    B3625 迷宫寻路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

    DFS

    1. #include
    2. const int N=110;
    3. char g[N][N];
    4. bool st[N][N];
    5. int n,m;
    6. int dx[]={0,1,0,-1};
    7. int dy[]={1,0,-1,0};
    8. int flag=0;
    9. void dfs(int x,int y)
    10. {
    11. if(flag) return;
    12. if(x==n&&y==m)
    13. {
    14. flag=1;
    15. return ;
    16. }
    17. for(int i=0;i<4;i++)
    18. {
    19. int a=x+dx[i];
    20. int b=y+dy[i];
    21. if(a<1||b<1||a>n||b>m) continue;
    22. if(g[a][b]=='#') continue;
    23. if(st[a][b]) continue;
    24. st[a][b]=true;
    25. dfs(a,b);
    26. if(flag) return;
    27. st[a][b]=false;
    28. }
    29. return ;
    30. }
    31. signed main()
    32. {
    33. std::cin>>n>>m;
    34. for(int i=1;i<=n;i++)
    35. {
    36. for(int j=1;j<=m;j++)
    37. {
    38. std::cin>>g[i][j];
    39. }
    40. }
    41. st[1][1]=true;
    42. dfs(1,1);
    43. if(!flag) std::cout<<"No"<<'\n';
    44. else std::cout<<"Yes"<<'\n';
    45. return 0;
    46. }

    因为这题数据是100,所以DFS是过不了哒。正解应该是BFS。 

     栈的写法可以直接ac,效率可见一斑。

    1. #include
    2. const int N=110;
    3. typedef std::pair<int,int> PII;
    4. char g[N][N];
    5. bool st[N][N];
    6. int n,m;
    7. int dx[]={0,1,0,-1};
    8. int dy[]={1,0,-1,0};
    9. int flag=0;
    10. void dfs(int x,int y)
    11. {
    12. std::stack stk;
    13. st[x][y]=true;
    14. stk.push({x,y});
    15. while(!stk.empty())
    16. {
    17. auto t=stk.top();
    18. int a=t.first;
    19. int b=t.second;
    20. if(a==n&&b==m)
    21. {
    22. flag=1;
    23. return ;
    24. }
    25. int ok=0;
    26. for(int i=0;i<4;i++)
    27. {
    28. int na=a+dx[i],nb=b+dy[i];
    29. if(g[na][nb]=='#') continue;
    30. if(st[na][nb]) continue;
    31. if(a<1||b<1||a>n||b>m) continue;
    32. //这个点可以走
    33. ok=1;
    34. st[na][nb]=true;
    35. stk.push({na,nb});
    36. }
    37. if(!ok)
    38. {//不回溯是因为到这一步说明这个点是死胡同
    39. //st[stk.top().first][stk.top().second]=0;
    40. stk.pop();
    41. }
    42. }
    43. return ;
    44. }
    45. signed main()
    46. {
    47. std::cin>>n>>m;
    48. for(int i=1;i<=n;i++)
    49. {
    50. for(int j=1;j<=m;j++)
    51. {
    52. std::cin>>g[i][j];
    53. }
    54. }
    55. dfs(1,1);
    56. if(flag) std::cout<<"Yes"<<'\n';
    57. else std::cout<<"No"<<'\n';
    58. return 0;
    59. }

    BFS

    宽度优先搜索

    1. #include
    2. typedef std::pair<int,int> PII;
    3. const int N=110;
    4. int n,m;
    5. char g[N][N];
    6. int dist[N][N];
    7. PII q[N*N];
    8. int hh=0,tt=-1;
    9. int dx[]={0,1,0,-1};
    10. int dy[]={1,0,-1,0};
    11. void bfs(int x,int y)
    12. {
    13. memset(dist,-1,sizeof dist);
    14. dist[x][y]=0;
    15. q[++tt]={x,y};
    16. while(hh<=tt)
    17. {
    18. PII t=q[hh++];
    19. for(int i=0;i<4;i++)
    20. {
    21. int a=t.first+dx[i];
    22. int b=t.second+dy[i];
    23. if(dist[a][b]!=-1) continue;
    24. if(g[a][b]=='#') continue;
    25. if(a<1||b<1||a>n||b>m) continue;
    26. q[++tt]={a,b};
    27. dist[a][b]=dist[x][y]+1;
    28. if(a==n&&b==m)
    29. {
    30. std::cout<<"Yes";
    31. return ;
    32. }
    33. }
    34. }
    35. std::cout<<"No";
    36. return ;
    37. }
    38. signed main()
    39. {
    40. std::cin>>n>>m;
    41. for(int i=1;i<=n;i++)
    42. {
    43. for(int j=1;j<=m;j++)
    44. {
    45. std::cin>>g[i][j];
    46. }
    47. }
    48. bfs(1,1);
    49. return 0;
    50. }

  • 相关阅读:
    两数相加(leetcode 2)
    intel cpu core/“酷睿”系列发展史,供组装机的朋友们参考
    基于Python实现汽车销售数据可视化【500010086】
    基础知识-网络与服务器
    Windows CSC提权漏洞复现(CVE-2024-26229)
    Istio Ambient Mesh 介绍
    推荐一些小而美的互联网公司
    【毕业季·进击的技术er】机械专业在校生的学习规划
    为什么ArcGIS添加的TIFF栅格数据是一片纯色
    从一道面试题来学习前台进程和后台进程、孤儿进程和僵尸进程
  • 原文地址:https://blog.csdn.net/m0_74183164/article/details/133799196