题目描述
给出一个N*N的迷宫矩阵示意图,从起点[0,0]出发,寻找路径到达终点[N-1, N-1]
要求使用堆栈对象来实现,具体算法参考课本3.2.4节51页
输入
第一行输入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<bits/stdc++.h>
using namespace std;
int mg[50][50];
int n;
int nextdir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
struct Point
{
int x,y;
int dir;
};
int find()
{
stack<Point> p;
Point start,now,pro;
int flag=0;
start.x=1;
start.y=1;
start.dir=0;
pro=start;
// p.push(start);
// mg[0][0]=-1;.
now.x=start.x;
now.y=start.y;
while(now.x!=n||now.y!=n)
{
//pro=p.top();
now.x=pro.x+nextdir[pro.dir][0];
now.y=pro.y+nextdir[pro.dir][1];
now.dir=pro.dir;
if(now.x==n&&now.y==n)
{
p.push(pro);
p.push(now);
break;
}
if(mg[now.x][now.y]==0)
{
Point a;
a.x=pro.x;
a.y=pro.y;
a.dir=pro.dir;
p.push(a);
mg[pro.x][pro.y]=-1;
pro.x=now.x;
pro.y=now.y;
pro.dir=0;
}
else
{
pro.dir++;
while(pro.dir>3)
{
if(!p.empty())
{
Point a;
a=p.top();
pro.x=a.x;
pro.y=a.y;
pro.dir=a.dir;
p.pop();
pro.dir++;
}
}
}
if(now.x==1&&now.y==1)
return 0;
}
stack<Point> s;
while(!p.empty())
{
s.push(p.top());
p.pop();
}
while(!s.empty())
{
flag++;
cout<<"["<<s.top().x-1<<","<<s.top().y-1<<"]--";
if(flag%4==0)
cout<<endl;
s.pop();
}
return 1;
}
int main()
{
int t,i,j;
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>mg[i][j];
for(i=0;i<n+2;i++)
{
mg[0][i]=1;
mg[i][0]=1;
mg[i][n+1]=1;
mg[n+1][i]=1;
}
if(find())
cout<<"END"<<endl;
else
cout<<"no path"<<endl;
}
return 0;
}