版权声明:本文为CSDN博主「Lil box」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hhhertzzz/article/details/109011140
这道题打了痕迹都没有打出来,后来参考了大佬的,竟然只用了不到100行就做出了。
我开始做这道题的时候,用多设置了一个二维数组,想标记走没走过,看我达兰的文章发现走过了的地方值直接变为1就好了。
大致算法流程:若当前位置可以走(为0),就可以纳入路径(入栈,同时将值设为1 ,代表走过了)。下一位置按照右下左上 的顺序探索,为0即纳入路径,若四个方向都不同,就删除当前位置(出栈)。
#include <iostream>
#include <stack>
#include <string>
using namespace std;
struct position {
int x,y;
};
int main() {
int t, n;
cin>>t;
while(t--) {
stack<position> path;
cin>>n;
int **maze = new int*[n];
for(int i = 0; i < n; i++) {
maze[i] = new int [n];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin>>maze[i][j];
}
}
path.push({0,0});
maze[0][0] = 1;
int i = 0, j = 0;
while(1) { //右下左上
if(j + 1 < n && maze[i][j+1] == 0) { //右走
maze[i][j+1] = 1;
path.push({i,++j});
} else if(i + 1 < n && maze[i+1][j] == 0) { // 下走
maze[i+1][j] = 1;
path.push({++i,j});
} else if(j - 1 >= 0 && maze[i][j-1] == 0) { //左走
maze[i][j-1] = 1;
path.push({i,--j});
} else if(i - 1 >= 0 && maze[i-1][j] == 0) { //上走
maze[i-1][j] = 1;
path.push({--i,j});
} else {
path.pop();
if(!path.empty()) { //无路可走回到原点时,path为空,防止越界
i = path.top().x;
j = path.top().y;
}
}
if(path.empty() || (i == n - 1 && j == n - 1)) { //判断是否在到达终点或返回起点
break;
}
}
if(path.empty()) {
cout<<"no path"<<endl;
} else {
stack<position> path1;
while(!path.empty()) {
path1.push(path.top());
path.pop();
}
i = 0;
while (!path1.empty()) {
if ((++i) % 4 == 0) {
cout << '[' << path1.top().x << ',' << path1.top().y << ']' << "--" << endl;
} else {
cout << '[' << path1.top().x << ',' << path1.top().y << ']' << "--";
}
path1.pop();
}
cout << "END" << endl;
}
for (int i = 0; i < n; i++)
delete []maze[i];
delete[]maze;
}
}