DS堆栈--迷宫求解

题目描述
给出一个N*N的迷宫矩阵示意图,从起点[0,0]出发,寻找路径到达终点[N-1, N-1]
要求使用堆栈对象来实现
输入
第一行输入t,表示有t个迷宫
第二行输入n,表示第一个迷宫有n行n列
第三行起,输入迷宫每一行的每个方格的状态,0表示可通过,1表示不可通过
输入n行
以此类推输入下一个迷宫
输出
逐个输出迷宫的路径
如果迷宫不存在路径,则输出no path并回车
如果迷宫存在路径,将路径中每个方格的x和y坐标输出,从起点到终点,每输出四个方格就换行,最终以单词END结尾,具体格式参考示范数据
输出的代码参考如下:
//path是保存路径的堆栈,堆栈中每个元素都包含x坐标和y坐标,用属性xp和yp表示
//path1是一个临时堆栈,把path的数据倒序输出到path1,使得路径按正序输出
if (!path.empty()) //找到路径
{ //…若干代码,实现path的数据导入path1
i=0; //以下是输出路径的代码
while (!path1.empty())
{ cpos = path1.top();
if ( (++i)%4 == 0 )
cout<<’[’<<cpos.xp<<’,’<<cpos.yp<<’]’<<"–"<<endl;
else
cout<<’[’<<cpos.xp<<’,’<<cpos.yp<<’]’<<"–";
path1.pop();
}
cout<<“END”<<endl;
}
else
cout<<“no path”<<endl; //找不到路径输出no path
样例输入
2
8
0 0 0 1 1 1 1 1
1 0 0 0 1 0 0 1
1 0 0 0 1 0 0 0
1 1 0 0 0 0 0 1
0 0 1 1 0 1 1 0
0 0 0 0 0 0 1 1
1 1 1 1 1 0 0 1
0 0 0 0 1 0 0 0
7
0 0 0 1 1 1 1
1 0 0 1 0 0 1
1 0 0 1 0 0 0
1 1 0 0 0 0 1
0 0 1 1 0 1 0
1 0 0 0 0 1 0
0 0 0 0 1 1 0
样例输出
[0,0]–[0,1]–[0,2]–[1,2]–
[1,3]–[2,3]–[3,3]–[3,4]–
[4,4]–[5,4]–[5,5]–[6,5]–
[6,6]–[7,6]–[7,7]–END
no path

思路

迷宫的走法从左上到右下的话是右下左上的优先级

#include<iostream>
#include<stack>
using namespace std;
const int maxx= 100;
int shu[maxx][maxx];
int n;
int path(int i, int j){//判断四个方向中右上下左的顺序那个可行
    if(j+ 1< n&&!shu[i][j+ 1])
        return 1;
      else if(i+ 1< n&& !shu[i+ 1][j])
        return 2;
        else if(j- 1>= 0&&!shu[i][j- 1])
        return 3;
        else if(i- 1>= 0&&!shu[i- 1][j])
            return 4;
         return 0;
}
int main(){
     
    int t;
    int ii[]= {0, 0, 1, 0, -1};
    int jj[]= {0, 1, 0, -1, 0};
    cin>>t;
    while(t--){
     
        cin>>n;
         
        stack<int> stx;
        stack<int> sty;
         
         
        for(int i= 0; i< n; i++)
         for(int j= 0; j< n; j++)
          cin>>shu[i][j];
          
         
        stx.push(0);
        sty.push(0);
        shu[0][0]= 1;
         int i= 0;
         int j= 0;
         while(1){
            int k= path(i, j);
     
            if(k){
                i+= ii[k];
                j+= jj[k];
                shu[i][j]= 1;
                stx.push(i);
                sty.push(j);
 
             }
             else if(!stx.empty()&&!sty.empty()){//四个方向不可行则回退
                  i= stx.top();
                  j= sty.top();
                  if(!path(i, j)){先判断下该点还有没有路,没有则pop()该点
                     stx.pop();
                     sty.pop();
                   }
                      
                    
                  
             }
     
            if((stx.empty()&&sty.empty())|| (i== n-1&&j== n-1))
              break;//全部pop掉或到达终点则退出循环
         } 
           
          if(stx.empty()&&sty.empty())
          {
            cout<<"no path"<<endl;
          }
          else{
              int zuo[1000];
              int len= 0;
              int l= 0;
               
            while(!stx.empty()&&!sty.empty()){
             len+= 2;//注意这里是i和j同时插入,所以要加2
             zuo[l++]= stx.top();
             zuo[l++]= sty.top();
             stx.pop();
             sty.pop();
             }
              
             int flag= 1;
             for(int i= len- 1; i>= 0;){
                 
                cout<<'['<<zuo[i--]<<','<<zuo[i--]<<']'<<"--";
                if((flag++)%4== 0)
                cout<<endl;
              }
              cout<<"END"<<endl;
           } 
        }
        return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/82762939