目录
题目描述
给出一个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结尾,具体格式参考示范数据
输入样例:
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;
typedef struct {
int i; //当前方块的行号
int j; //当前方块的列号
int di; //di是下一可走相邻方位的方位号,即di=0、1、2、3
} Box; //定义方块类型
int main()
{
int t;
cin >> t;
while (t--)
{
int n, i, j, f = 0;//f作为是否找到迷宫路径的标志
stack <Box> s;
cin >> n;
int** mg=new int *[n];
for (i = 0; i < n; i++)
mg[i] = new int[n];
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
cin >> mg[i][j];
i = 0; j = 0;
Box b = { i,j,-1 }, p;
s.push(b); //入口入栈
mg[i][j] = -1;
while (!s.empty())
{
p = s.top();//取出栈顶
if (p.i == n-1 && p.j == n-1)//找到迷宫路径并输出
{
stack<Box>ss;//临时栈,为了正序输出
while (!s.empty())
{
ss.push(s.top());
s.pop();
}
int k = 0;
while (!ss.empty())
{
cout << '[' << ss.top().i << ',' << ss.top().j << "]--";
if (++k % 4 == 0)
cout << endl;
ss.pop();
}
cout <<"END"<< endl;
f = 1;
break;
}
while (++s.top().di < 4)//此循环可持续到找到出口
{
i = s.top().i; j = s.top().j;
switch (s.top().di)
{
case 0:j++; break;
case 1:i++; break;
case 2:j--; break;
case 3:i--; break;
}
if (i<n&&i>=0&&j<n&&j>=0&&mg[i][j] == 0)//未出界且下一个方块为可通方块
{
Box bb = { i,j,-1 };
s.push(bb);
mg[i][j] = -1;
}
if (i == n-1 && j == n - 1)//找到迷宫路径,跳出循环
break;
}
if(s.top().di==4)//没有找到(i,j,di)的任何一个相邻可走方块
s.pop();
}
if (f == 0)//没有找到迷宫路径
cout << "no path" << endl;
}
return 0;
}
前言:
学C++刷的题,浅浅记录一下
总结:
这道题是课本《数据结构(C语言本)》里的,代码也是根据书里的教程写的,毫无技巧