DS堆栈--迷宫求解

2024-04-27 18:18
文章标签 求解 ds 迷宫 堆栈

本文主要是介绍DS堆栈--迷宫求解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题 B: DS堆栈--迷宫求解

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

 注意图示的隐藏案例,第一个格子为1的时候直接no path!!

 代码实现:

#include <iostream>
#include <stack>
using namespace std;struct position {int x;int y;
};class Maze {int** maze;int size;stack<position> path;
public:Maze(int n);int  Go();
};
Maze::Maze(int n) {size = n;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];
}int Maze::Go() {if (maze[0][0] == 1) //直接no path 并且跳出函数{cout << "no path" << endl;return 0;}// 进入迷宫path.push({ 0, 0 });maze[0][0] = 1;int i = 0, j = 0;// 迷宫按照右下左上走while (true) {if (path.empty() || (i == size - 1 && j == size - 1))  //如果回退到起点或者到达终点就结束循环break;if (j + 1 < size && maze[i][j + 1] == 0)    //向右{maze[i][j + 1] = 1;   //代表走过path.push({ i, ++j }); //走到 i,j+1位置,入栈}else if (i + 1 < size && 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    //无路可走{//回退i = path.top().x;j = path.top().y;//判断回退之后是否还有可以走的路if (!((j + 1 < size && maze[i][j + 1] == 0) || (i + 1 < size && maze[i + 1][j] == 0) || (j - 1 >= 0 && maze[i][j - 1] == 0) || (i - 1 >= 0 && maze[i - 1][j] == 0)))path.pop();  //出栈}}//输出路径if (!path.empty()){stack<position> path1;while (!path.empty())   //将path倒序{path1.push(path.top());path.pop();}i = 0;while (!path1.empty()) {if ((++i) % 4 == 0)cout << '[' << path1.top().x << ',' << path1.top().y << ']' << "--" << endl;elsecout << '[' << path1.top().x << ',' << path1.top().y << ']' << "--";path1.pop();}cout << "END" << endl;}else cout << "no path" << endl;return 0;
}
int main() {int t;cin >> t;while (t--) {int n;cin >> n;Maze myMaze(n);myMaze.Go();}return 0;
}

日常提神醒脑环节:

 

 

 

这篇关于DS堆栈--迷宫求解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941193

相关文章

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

nyoj306(走迷宫)

走迷宫 时间限制: 1000 ms  |  内存限制: 65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。 这个迷宫可以向上走,向

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

浙大数据结构:堆栈和队列的定义与操作

堆栈: 顺序存储: #include<stdio.h>#include<stdlib.h>typedef int ElementType ;typedef int position ;#define MAXSIZE 100#define ERROR -1struct SNode {ElementType * Data ;position top;int Maxsize;};

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

【2024全国大学生数学建模竞赛】B题 模型建立与求解(含代码与论文)

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明(等四问全部更新完再写)5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成! - 晚上7-8点之前第二问完成 - 明天中文之前全部写完 按照提交论文的格式进行撰写!完整版请看文章最后!

Java 快速求解x的x次幂结果为10

1.问题描述 如果x的x次幂结果为10(如图所示),你能计算出x的近似值吗? 显然,这个值是介于2和3之间的一个数字。 可以使用牛顿迭代公式进行求解,因为是逼近算法可以大大减少运算次数 public static void main(String[] args) {int i = 0;double x1 = 2.5;while (true) {i++;//x^x - 10 = 0//这一步

《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫

 示例:基于抽象工厂的迷宫   实现:     如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。  请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类