• 用栈解决迷宫问题


    一、

    因为栈是后进先出的特性,所以说一般用栈都是通过dfs来解决迷宫问题。如果用队列的话就是通过bfs来解决。

    二、

    c++代码:

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<stdio.h>
      4 #include<string.h>
      5 #include<windows.h>
      6 using namespace std;
      7 const int maxn=1005;
      8 #define MaxSize    100005     //栈最多元素个数
      9 int M=4,N=4;
     10 int w[6][6]=
     11 {
     12     {1,1,1,1,1,1}
     13     ,{1,0,0,0,1,1}
     14     ,{1,0,1,0,0,1}
     15     ,{1,0,0,0,1,1}
     16     ,{1,1,0,0,0,1}
     17     ,{1,1,1,1,1,1}
     18 };
     19 int mg[maxn][maxn];
     20 char s[maxn][maxn];
     21 struct migong
     22 {
     23     int i;      //路径横坐标
     24     int j;      //路径纵坐标
     25     int di;     //方向
     26 } Stack[MaxSize],Path[MaxSize];     //定义栈和存放最短路径的数组
     27 int top=-1;     //栈顶指针
     28 int counts=1;    //路径数计数
     29 int minlen=MaxSize;     //最短路径长度
     30 void mgpath()       //路径为:(1,1)->(M,N)
     31 {
     32     int i,j,di,finds,k;
     33     top++;
     34     Stack[top].i=1;
     35     Stack[top].j=1;
     36     Stack[top].di=-1;
     37     mg[1][1]=-1;        //初始结点进栈
     38     while(top>-1)       //栈不空时循环
     39     {
     40         i=Stack[top].i;
     41         j=Stack[top].j;
     42         di=Stack[top].di;
     43         if(i==M && j==N)        //找到了出口,输出路径
     44         {
     45 //            cout<<counts<<": ";
     46 //            counts++;
     47 //            for(k=0; k<=top; k++)
     48 //            {
     49 //                cout<<"("<<Stack[k].i<<","<<Stack[k].j<<")"<<" ";
     50 //
     51 //            }
     52 //            cout<<endl;
     53             if(top+1<minlen)        //比较输出最短路径
     54             {
     55                 for(k=0; k<=top; k++)
     56                     Path[k]=Stack[k];
     57                 minlen=top+1;
     58             }
     59             mg[Stack[top].i][Stack[top].j]=0;   //让该位置变为其他路径的可走结点
     60             top--;
     61             i=Stack[top].i;
     62             j=Stack[top].j;
     63             di=Stack[top].di;
     64         }
     65         finds=0;
     66         while(di<4 && finds==0)      //找下一个可走结点
     67         {
     68             di++;
     69             switch(di)
     70             {
     71             case 0:
     72                 i=Stack[top].i-1;
     73                 j=Stack[top].j;
     74                 break;   //上面
     75             case 1:
     76                 i=Stack[top].i;
     77                 j=Stack[top].j+1;
     78                 break;   //右边
     79             case 2:
     80                 i=Stack[top].i+1;
     81                 j=Stack[top].j;
     82                 break;   //下面
     83             case 3:
     84                 i=Stack[top].i;
     85                 j=Stack[top].j-1;
     86                 break;   //左边
     87             }
     88             if(mg[i][j]==0)   //因为地图外边围了一层墙,所以不需要判断边界
     89                 finds=1;
     90         }
     91         if(finds == 1)       //找到了下一个可走结点
     92         {
     93             Stack[top].di=di;   //修改原栈顶元素的di值
     94             top++;      //下一个可走结点进栈
     95             Stack[top].i=i;
     96             Stack[top].j=j;
     97             Stack[top].di=-1;
     98             mg[i][j]=-1;        //避免重复走到该结点
     99         }
    100         else
    101         {
    102             mg[Stack[top].i][Stack[top].j]=0;   //让该位置变为其他路径的可走结点
    103             top--;
    104         }
    105     }
    106     cout<<"最短路径如下(输出结果以坐标显示)"<<endl;
    107     cout<<"长度:  "<<minlen<<endl;
    108     cout<<"路径:  "<<endl;
    109     for(k=0; k<minlen; k++)
    110     {
    111         cout<<"("<<Path[k].i<<","<<Path[k].j<<")"<<" ";
    112     }
    113 }
    114 int main()
    115 {
    116     int x;
    117     while(1)
    118     {
    119         system("cls");
    120         printf ( "             迷宫系统                                            
    ");
    121         printf ( "                                                                 
    ");
    122         printf ( "                                                                 
    ");
    123         printf ("--------------------------------------                           
    ");
    124         printf ("--------------------------------------
    ");
    125         printf ("--------丨[0]重构地图            丨---
    ");
    126         printf ("--------丨[1]使用默认地图        丨---
    ");
    127         printf ("--------丨[2]结束                丨---
    ");
    128         printf ("----------输入相应数字----------------
    ");
    129         printf ("---------------------------------------                           
    ");
    130         printf ( "                                                                 
    ");
    131         printf ( "                                                                 
    ");
    132         scanf("%d",&x);
    133         if(x==0)
    134         {
    135             system("cls");
    136             printf("            重构地图
    ");
    137             printf("输入内容请以空格或者换行分隔开,且0代表此处可走,1代表此处不可行
    ");
    138             printf("
    现在请输入地图是几行几列
    ");
    139             int n,m;
    140             memset(mg,0,sizeof(mg));
    141             scanf("%d%d",&n,&m);
    142             int flag=0;
    143             printf("
    请输入地图,请保证左上角和右下角都为0
    ");
    144             for(int i=1; i<=n; ++i)
    145             {
    146 
    147                 scanf("%s",s[i]+1);
    148                 mg[i][0]=mg[i][m+1]=1;
    149             }
    150             for(int j=1; j<=m; ++j)
    151             {
    152                 mg[0][j]=mg[n+1][j]=1;
    153             }
    154             for(int i=1;i<=n;++i)
    155             {
    156                 for(int j=1;j<=m;++j)
    157                 {
    158                     mg[i][j]=s[i][j]-'0';
    159                 }
    160             }
    161             M=n;
    162             N=m;
    163 
    164             //cout<<"迷宫所有路径如下:"<<endl;
    165             mgpath();
    166             system("pause");
    167         }
    168         else if(x==1)
    169         {
    170             system("cls");
    171             M=N=4;
    172             for(int i=0; i<6; ++i)
    173             {
    174                 for(int j=0; j<6; ++j)
    175                 {
    176                     mg[i][j]=w[i][j];
    177                 }
    178             }
    179             mgpath();
    180             system("pause");
    181         }
    182         else break;
    183     }
    184     return 0;
    185 }
    View Code
  • 相关阅读:
    关于sqlserver2008 bcp根据数据表导出xml格式文件的小记
    关于SQL SERVER 2008 X64版本报错:消息 7302,级别 16,无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.ACE.OLEDB.12.0" 的实例。
    Response.Redirect(),Server.Transfer(),Server.Execute()的区别[转]
    ASP.net应用程序中如何调用客户端的Javascript脚本小结(转)
    重写ListView控件,实现点击列头排序的功能
    关于Response.redirect和Response.End出现线程中止异常的处理(转)
    持续集成cruisecontrol.net学习总结
    [转]关于PowerDesigner反向工程SQL Server2000数据库时生成注释的解决方法
    敏捷开发scrum学习笔记一
    asp.net缓存机制总结(转)
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11835137.html
Copyright © 2020-2023  润新知