DS堆栈--迷宫求解


版权声明:本文为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;
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值