题目描述
给出一个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;
}