迷宫求解火车重排
迷宫问题算法

迷宫问题算法一、引言迷宫问题是一个经典的算法问题,对于寻找路径的算法有着广泛的应用。
迷宫是一个由通路和墙壁组成的结构,从起点出发,要找到通往终点的路径。
迷宫问题算法主要解决的是如何找到一条从起点到终点的最短路径。
二、DFS(深度优先搜索)算法深度优先搜索算法是迷宫问题求解中最常用的算法之一。
其基本思想是从起点开始,沿着一个方向不断向前走,当走到无法继续前进的位置时,回退到上一个位置,选择另一个方向继续前进,直到找到终点或者无路可走为止。
1. 算法步骤1.初始化一个空栈,并将起点入栈。
2.当栈不为空时,取出栈顶元素作为当前位置。
3.如果当前位置是终点,则返回找到的路径。
4.如果当前位置是墙壁或者已经访问过的位置,则回退到上一个位置。
5.如果当前位置是通路且未访问过,则将其加入路径中,并将其邻居位置入栈。
6.重复步骤2-5,直到找到终点或者栈为空。
2. 算法实现伪代码以下为DFS算法的实现伪代码:procedure DFS(maze, start, end):stack := empty stackpath := empty listvisited := empty setstack.push(start)while stack is not empty docurrent := stack.pop()if current == end thenreturn pathif current is wall or visited.contains(current) thencontinuepath.append(current)visited.add(current)for each neighbor in getNeighbors(current) dostack.push(neighbor)return "No path found"三、BFS(广度优先搜索)算法广度优先搜索算法也是解决迷宫问题的常用算法之一。
火车车厢重排问题

⽕车车厢重排问题2014-11-04主要数据结构:栈题⽬:⼀列⽕车要将n节车厢分别送往n个车站按1~n的次序编号,⽕车按照n,n-1,…1的编号次序经过车站。
假设车厢的编号就是其⽬的地车站的编号。
要求:给定⼀个任意的车厢排列次序。
重新排列车厢,使其按照从1到n的次序排列。
规定重排时,只能从⼊轨到缓冲铁轨,或者从缓冲铁轨到出轨。
总的思路:⾸先:将所需要重排的车厢编号从左到右依次输⼊数组carrage中;然后:对carrage中的元素进⾏从左往右逐个遍历,如果符合下⼀个输出,则直接将其输出,并且遍历所有的缓冲轨道,查找是否有符合下⼀个输出的车厢,有的话便将其输出,否则将其压⼊缓冲轨道未经优化的代码:1 #include <iostream>2 #include <stack>3using namespace std;45 stack<int> stack_final;678void Output(int& minH, int& minS, stack<int> H[], int k, int n) {9// put the car from the strack to the output line, and change the minH and minS10int index; // the index of the car11//delete the minist car number from the minS12 stack_final.push(H[minS].top());13 H[minS].pop();14 cout << "Move car " << minH << "from holding track " << minS << " to output line" << endl;15//serch all the track's top, find the new minH and minS16 minH = n+2;17for (int i= 0; i < k; i++) {18if (!H[i].empty() && (index = H[i].top()) < minH) {19 minH = index;20 minS = i;21 }22 }23 }2425bool Input(int c, int& minH, int& minS, stack<int> H[], int k, int n) {26// put the new car c into the track27// if there is no available track, then return false, else return true28// find the best track for the car c29// initial30int BestTrack = 0; //the best track now31int BestTop = n+1; //the best track's top car32int index; //the index for the car33// search the k track34for (int i= 0; i < k; i++) {35if (!H[i].empty()) {36 index = H[i].top();37if (c < index && index < BestTop) {38//the top car's number is the smallest39 BestTop = index;40 BestTrack = i;41 }42 } else { // the track is empty43if (!BestTrack) {44 BestTrack = i;45 }46 }47 }48if (!BestTrack) {49return false; //there is available track to use50 }51 H[BestTrack].push(c);52 cout << "Move car " << c << "from input to holding track " << BestTrack << endl;53//if it is essencial, then change the minH and minS54if (c < minH) {55 minH = c;56 minS = BestTrack;57 }58return true;59 }6061bool Railroad(int input[], int n, int k) {62//k63// if it resort succed, then return true, else return false64// create the stack according to the k65 stack<int> *H;66 H = new stack<int> [k];67int NowOut = 1; // the next number of car to putout68int minH = n+1; //the minist number car in the k69int minS; //the minist number's strack70// resort the car71for (int i = n-1; i >= 0; i--) {72int number = input[i];73if (number == NowOut) {74 cout << "Move car " << number << " from the input line to the output line\n";75 stack_final.push(number);76 NowOut++;77while (minH == NowOut) {78 Output (minH, minS, H, k, n);79 NowOut++;80 }81 } else {82int end = 0;83for (int j = i; j > 0; j--) {84if (input[j-1] < input[j]) {85 end = j;86break;87 }88 }89for (int j = end; j <= i; j++) {90if (!Input (input[j], minH, minS, H, k, n)) {91return false;92 }93 }94if (end) {95 i = end;96 }97 }98 }99return true;100 }101102int main() {103int n, *input;104 cin >> n;105 input = new int[n];106for (int i = 0; i < n; i++) {107 cin >> input[i];108 }109if (Railroad(input, n, n-1)) {110 cout << "resort succed!\n";111while (!stack_final.empty()) {112 cout << stack_final.top() << "";113 stack_final.pop();114 }115 } else {116 cout << "failed\n";117 }118 }View Code经过优化之后的代码:增加的条件:车厢可以从排在后⾯的缓冲轨道移到前⾯的缓冲轨道。
迷宫问题 火车车厢重排问题 实验报告

实验报告了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编号相同,这样,在每个车站只要卸掉最后一节车厢。
所以,给定任意次序的车厢,必须重新排列它们。
车厢的重排工作可以通过转轨站完成。
在转轨站中有一个入轨、一个出轨和k个缓冲轨,缓冲轨位于入轨和出轨之间。
假定缓冲轨按先进先出的方式运作,设计算法解决火车车厢重排问题。
②基本要求●设计存储结构表示n个车厢、k个缓冲轨以及入轨和出轨;●设计并实现车厢重排算法;●分析算法的时间性能。
③思考●如果缓冲轨按后进先出的方式工作,即用栈表示缓冲轨,应如何解决火车车厢重排问题?二、数据结构设计迷宫问题和火车重排问题可以通过栈与队列实现的。
迷宫的进出和车厢的出入轨和缓冲轨主要是对栈与队列的判断和操作。
int empty( STLink top[],int n) /*判断是否为空*/{return (top[n]==NULL);}int push(STLink top[],int A,int m) /*入栈*/{STLink p;if(!(p=(STLink)malloc(LEN)))return 0;else{p->data=A;p->link=top[m];top[m]=p;return 1;}}int pop(STLink top[],int m) /*出栈*/{int A;STLink p;p=top[m];A=p->data;top[m]=top[m]->link;free(p);return A;}struct Node{ /定义队列int data;Node* next;};三、算法设计1.迷宫问题:进入格子后,需要判断此时格子位置周围障碍物的位置,对其进行压栈,判断,然后看是否满足条件,满足就进栈,不满足就弹出,然后输出不能通过建立迷宫:typedef struct LStack{Element elem;struct LStack *next;}*PLStack;int InitStack(PLStack &S){S=NULL;return 1;}int StackEmpty(PLStack S){if(S==NULL)return 1;elsereturn 0;}int Push(PLStack &S, Element e){PLStack p;p=(PLStack)malloc(sizeof(LStack));p->elem=e;p->next=S;S=p;return 1;}(2).输出路径2.火车车厢排序六、实验收获与思考通过本次实验,进一步增强了对栈和队列的理解,明白的栈的先进后出和队列先进先出的方式,对压栈和出入栈与队列有了深刻认识。
数据结构迷宫求解

数据结构迷宫求解迷宫问题是一种常见的求解问题,通过在迷宫中找到从起点到终点的路径。
在计算机科学中,使用数据结构来解决迷宫问题非常方便。
本文将介绍迷宫问题的基本原理、常见的求解方法以及使用不同数据结构的优缺点。
首先,我们需要明确迷宫的基本定义。
迷宫可以看作是一个二维的网格,其中包含一些墙壁和通路。
起点是迷宫的入口,终点则是迷宫的出口。
我们的目标是找到从起点到终点的一条路径。
迷宫问题可以使用多种算法求解,包括深度优先(DFS)、广度优先(BFS)、最短路径算法等。
以下将详细介绍这些算法以及它们在迷宫问题中的应用。
同时,我们还会讨论不同数据结构在求解迷宫问题中的优缺点。
首先,深度优先(DFS)是一种常用的求解迷宫问题的算法。
该算法从起点开始,一直到终点,期间遇到墙壁或已经访问过的点则回溯到上一个节点。
DFS可以使用递归实现,也可以使用栈来保存需要回溯的节点。
DFS的优点是简单易懂,易于实现。
然而,它可能会陷入死循环或者找到一条较长的路径而不是最短路径。
另一种常见的算法是广度优先(BFS),它从起点开始,逐层扩展,直到找到终点为止。
BFS可以使用队列来保存每一层的节点。
与DFS相比,BFS能够找到最短路径,但它需要维护一个较大的队列,从而增加了空间复杂度。
除了DFS和BFS,还有一些其他算法可以应用于迷宫问题。
例如,迪杰斯特拉算法和A*算法可以找到最短路径。
这些算法使用了图的概念,将迷宫中的通道表示为图的边,将各个节点之间的距离表示为图的权重。
然后,通过计算最短路径的权重,找到从起点到终点的最短路径。
迪杰斯特拉算法和A*算法的优点是能够找到最短路径,但它们的实现较为复杂。
在使用这些算法求解迷宫问题时,我们需要选择适合的数据结构来存储迷宫和过程中的状态。
以下是几种常见的数据结构以及它们的优缺点:1.数组:数组是一种常见的数据结构,它可以用来表示迷宫。
可以使用二维数组来表示迷宫的网格,并使用特定的值表示墙壁和通路。
火车重排问题

火车车厢重排问题1.1火车车厢重排问题一列货运列车共有n节车厢,每节车厢将停放在不同的车站。
假定n个车站的编号分别为1~n,货运列车按照第n站至第1站的顺序经过这些车站。
车厢编号与他们的目的地一样。
为了便于从列车上卸掉相应的车厢,必须重排车厢顺序,使得各车厢从前往后按编号1到n的次序排列。
当所有车厢按照这种次序排列时,在每个车站只需卸掉最后一个车厢即可。
1.2想法一列火车的每个车厢按顺序从入轨进入不同缓冲轨,缓冲轨重排后的进入出轨,重新编排成一列货车。
比如:编号为3的车厢进入缓冲轨1,则下一个编号小于3的车厢则必须进入下一个缓冲轨2,而编号大于3的车厢则进入缓冲轨1,排在3号车厢的后面,这样,出轨的时候才可以按照从小到大的顺序重新编排我们在一个转轨站里完成重拍的工作,在转轨站有一个入轨,一个出轨和k个缓冲轨(位于入轨和出轨之间)。
下面的图示就是一个转轨站,其中有3个缓冲轨,H1,H2,H3。
(PPT中有动态演示)1.3算法描述:那么缓冲轨就不是FILO 而是FIFO了那么就要用队列来实现车厢重排了,算法的描述和栈实现的基本一样的,只是OutPut和Hold 函数改了一下,将一截车厢移动到缓冲轨时,车厢c应该移动到这样的缓冲轨中:该缓冲轨中现有各车厢的编号均小于c,如果有多个缓冲轨都满足这一条件,那么选择其中左端车厢编号最大的那个缓冲轨,否则选择一个空的缓冲轨(如果存在的话)1.4代码:#include<iostream>#include<stack>usingnamespace std;template<class T>void PrintfNum(T a[], constint& n);// move cars from holding track to output trackvoid OutPut(stack<int> t[],int n, int totalStack,int& min){//move car from holding trackfor(int x = 0;x <totalStack; ++x){if(!t[x].empty() && t[x].top() == min){cout<<"Move car "<< t[x].top() <<" from holding track "<< x <<" to output"<<endl;t[x].pop();++min;x = -1; // find next car from the first holding track 0}}}// move cars from input track to holding trackbool Hold(stack<int> t[],int n , int totalStack){for(int i = 0;i <totalStack; ++i){if(t[i].empty() || (!t[i].empty() && t[i].top() > n)){cout<<"holding track "<<i<<" hold car "<< n <<endl;t[i].push(n);returntrue; // we already find a holding track, so break the loop. }}returnfalse;}int main(int argc, char* argv[]){constint NUM = 9;constint STACKNUM = 3;stack<int> t[STACKNUM];int min = 1;int a[NUM] = {5,8,1,7,4,2,9,6,3};PrintfNum(a,NUM);for(int i = NUM - 1; i>= 0; --i){if(a[i] == min){// try to move cars from input track or holding track cout<<"Move car "<< a[i] <<" from input to output"<<endl;++min;OutPut(t,a[i],STACKNUM,min);}else{// move cars from input track to holding trackif(!Hold(t,a[i],STACKNUM)){cout<<"Not enough holding track"<<endl;break;}}} getchar();return 0;}template<class T>void PrintfNum(T a[], constint& n){for(int i = 0; i< n; ++i){cout<< a[i] <<",";}cout<<endl;}1.5火车车厢重排问题决策过程H1H2H31.5.1初始数组H1 H2 H31.5.2H1H2H3H1 H2 H3H1 H2 H3H1 H2 H3H1 H2 H3H1 H2 H3H1H2 H3H1 H2 H3H1 H2 H3H1 H2 H3H1 H2 H3 1.6程序运行截图。
数据结构 迷宫求解

数据结构迷宫求解数据结构迷宫求解一、引言数据结构是计算机科学中最基础、最重要的内容之一。
它能帮助我们存储和组织数据,并提供了各种算法来对这些数据进行处理和操作。
迷宫求解是其中一种经典的应用场景,通过使用适当的数据结构和算法,能够在迷宫中寻找到一条从起点到终点的路径。
本文将介绍一种常用的迷宫求解算法,并给出相应的数据结构实现。
二、问题描述1:迷宫定义:迷宫是一个由墙壁和路障组成的二维矩阵,其中墙壁表示不可通行的区域,路障表示可通行但需要绕过的区域。
迷宫通常具有一个起点和一个终点,我们需要找到一条从起点到终点的路径。
2:算法目标:实现一个算法,能够在给定的迷宫中找到一条从起点到终点的路径,并输出该路径。
三、数据结构设计1:迷宫的存储结构:为了方便表示迷宫,我们可以使用一个二维数组来表示迷宫的格子,其中每个格子表示一个迷宫的单元。
我们可以使用0表示可通行的空格,使用1表示墙壁,使用2表示路障。
同时,我们需要记录每个格子的状态,以标记是否已经被访问过。
2:路径的存储结构:为了记录找到的路径,我们可以使用一个栈来存储路径上的各个节点。
在访问迷宫时,我们将访问过的格子入栈,并在找到终点后,按照栈的顺序依次弹出格子,即可得到路径。
四、算法设计1:深度优先搜索算法:深度优先搜索是一种常用的图遍历算法,适用于解决迷宫问题。
其基本思想是从起点出发,沿着某一条路径一直向前,直到终点或者无法前进为止。
当无法前进时,回退到上一个节点,并尝试其他路径,直到找到终点或者所有路径都尝试完毕。
2:算法步骤:- 将起点入栈,并标记其为已访问;- 当栈不为空时,弹出栈顶元素,并尝试向上、下、左、右四个方向前进,如果某一方向可以前进且未被访问过,则将该方向上的格子入栈,并标记为已访问;- 当找到终点时,输出路径;- 当所有路径都尝试完毕时,结束算法。
五、算法实现1:迷宫的表示:我们可以使用一个二维数组来存储迷宫,如下所示: ```pythonmaze = [[0, 1, 0, 0, 0],[0, 1, 0, 1, 0],[0, 0, 0, 0, 0],[0, 1, 1, 1, 0],[0, 0, 0, 1, 0]]```2:深度优先搜索的实现:我们可以使用递归来实现深度优先搜索算法,如下所示:```pythondef dfs(maze, start, end, path):if start == end:return Truei, j = startmaze[i][j] = 2path:append(start)if i > 0 and maze[i - 1][j] == 0 anddfs(maze, (i - 1, j), end, path):return Trueif i < len(maze) - 1 and maze[i + 1][j] == 0 and dfs(maze, (i + 1, j), end, path):return Trueif j > 0 and maze[i][j - 1] == 0 anddfs(maze, (i, j - 1), end, path):return Trueif j < len(maze[0]) - 1 and maze[i][j + 1] == 0 and dfs(maze, (i, j + 1), end, path):return Truepath:pop()return Falsedef solve_maze(maze, start, end):path = []dfs(maze, start, end, path)return path```六、待解决的问题1:如何处理迷宫中存在的死胡同(即无法找到终点的路径)?2:如何处理迷宫中存在的多条路径(即多个路径都能到达终点)?附件:- 迷宫示例图片- 算法实现示例代码- 数据结构设计图法律名词及注释:1:数据结构:在计算机科学中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
数据结构课程设计——迷宫求解问题

《数据结构课程设计:迷宫》实验报告任务分配:●程序员:主要任务:负责整体的算法设计以及程序的主要源代码的编写。
●测试员:主要任务:负责在程序员每完成一个阶段对程序进行挑错,测试主程序并对实验结果进行整理分析,最后完成实验报告的第三、四部分即测试结果与分析探讨的内容。
●文档员:主要任务:负责对程序及界面的美观提出改善意见,查找程序的小漏洞,负责撰写实验报告的第一、二部分即实验内容简介与算法描述的内容。
同时完成整个文档的整合,使整篇报告排版、文字风格统一。
一、简介图的遍历就是从指定的某个顶点(称其为初始点)出发,按照一定的搜索方法对图中的所有顶点各做一次访问过程。
根据搜索方法不同,遍历一般分为深度优先搜索遍历和广度优先搜索遍历。
本实验中用到的是广度优先搜索遍历。
即首先访问初始点v i,并将其标记为已访问过,接着访问v i的所有未被访问过的邻接点,顺序任意,并均标记为已访问过,以此类推,直到图中所有和初始点v i有路径相通的顶点都被访问过为止。
鉴于广度优先搜索是将所有路径同时按照顺序遍历,直到遍历出迷宫出口,生成的路径为最短路径。
因此我们采用了广度优先搜索。
无论是深度优先搜索还是广度优先搜索,其本质都是将图的二维顶点结构线性化的过程,并将当前顶点相邻的未被访问的顶点作为下一个顶点。
广度优先搜索采用队列作为数据结构。
本实验的目的是设计一个程序,实现手动或者自动生成一个n×m矩阵的迷宫,寻找一条从入口点到出口点的通路。
具体实验内容如下:选择手动或者自动生成一个n×m的迷宫,将迷宫的左上角作入口,右下角作出口,设“0”为通路,“1”为墙,即无法穿越。
假设一只老鼠从起点出发,目的为右下角终点,可向“上、下、左、右、左上、左下、右上、右下”8个方向行走。
如果迷宫可以走通,则用“■”代表“1”,用“□”代表“0”,用“☆”代表行走迷宫的路径。
输出迷宫原型图、迷宫路线图以及迷宫行走路径。
如果迷宫为死迷宫,则只输出迷宫原型图。
探索数学迷宫学习解决迷宫问题

探索数学迷宫学习解决迷宫问题数学迷宫是一种富有挑战性和趣味性的问题,通过解决迷宫问题,我们不仅可以锻炼思维能力,还能在数学推理方面得到很大的提高。
本文将探索数学迷宫学习解决迷宫问题的方法和技巧。
1. 迷宫问题的基本定义数学迷宫问题是指在一个由通道和墙壁组成的方格图中,找到从起点到终点的路径。
迷宫问题中,起点和终点是已知的,而我们的任务就是找到一条从起点到终点的有效路径。
有效路径要求在到达终点之前,不能回退,只能选择向前、向左、向右或向下移动。
2. 搜索算法解决迷宫问题最常用的方法之一是搜索算法。
搜索算法有很多种,如深度优先搜索(DFS)和广度优先搜索(BFS)。
深度优先搜索是一种通过不断地向前搜索直到无法继续,然后回退到前一步的算法。
广度优先搜索则是一种逐层扩展搜索的算法。
这些算法可以通过递归或使用栈或队列进行实现。
3. 最短路径问题在迷宫问题中,我们通常不仅仅关注是否能够找到一条路径,还关注如何找到最短路径。
最短路径是指从起点到终点的路径中,所需步数最少的路径。
解决最短路径问题的常用算法是Dijkstra算法和A*算法。
Dijkstra算法通过计算每个节点的最短路径实现,而A*算法则是一种基于启发式搜索的算法,通过估计每个节点到终点的距离来选择下一步的移动方向。
4. 数学模型迷宫问题也可以转化为数学模型,从而应用更多的数学理论和算法进行解决。
可以使用图论中的图模型来表示迷宫,将每个方格看作图中的节点,将相邻的方格之间的通道看作节点之间的边。
然后,可以使用图论中的最短路径算法来解决迷宫问题。
5. 相关应用迷宫问题在现实生活中有许多应用。
例如,迷宫问题可以用来解决寻路问题,如无人驾驶车辆的路径规划、机器人的导航等。
此外,迷宫问题还可以应用于游戏设计中,设计出各种不同难度的迷宫关卡,给玩家带来挑战和乐趣。
总之,通过探索数学迷宫学习解决迷宫问题,我们可以培养逻辑思维和数学推理能力。
通过应用搜索算法、最短路径算法和数学模型,我们能够有效解决迷宫问题,并将此应用于更广泛的领域中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} if(man.di < UP)//curpos点不通,则继续按方向顺序探索man周围的下 一个点 {
st.pop(); man.di = (DIR)(man.di+1); st.push(man); curpos = NextPos(man.pos,man.di); } } } }while(!st.isempty()); return false; }
return ((x==p.x)&&(y==p.y)); } } Pos;
迷宫中人的模拟:
typedef struct Man //模拟人 {
Pos pos; DIR di; } Man;
3.算法设计
系统输出迷宫通路,迷宫在程序中设定。
(1)参数给出当前位置及方向,返回下一位置:
Pos NextPos(Pos pos, DIR di) {
图1 迷宫示意图 迷宫四周设为墙;无填充处,为可通处。设每个点有四个 可通方向,分别为东、南、西、北。左上角为入口。右下角为 出口。迷宫有一个入口,一个出口。设计程序求解迷宫的一条 通路。
2.数据结构设计
栈类的实现:
template<class Type> class Stack { public:
man = st.gettop(); while(man.di==UP && !st.isempty()) {//如果curpos不能通过,且man周围的点都探索完毕,人 就往后退
st.pop(); // MarkMaze(maze,man.pos);
if(!st.isempty()) {
man = st.gettop(); } else//栈空了 说明回到出口了,此迷宫没有通路 {
} void push(Type &x) { if(!isfull()) {
base[top++] = x; } } void pop() { if(!isempty()) { top--; } } Type gettop()const { if(!isempty()) { return base[top-1]; } } private: enum{STACK_SIZE=100}; Type *base; size_t top; size_t capacity; };
} while(!st.isempty()); return false; }
(2) 迷宫通路的输出在模拟走迷宫中实现,与迷宫通路的标 记同时完成:
void FootMaze(Maze maze,Pos pos) {
maze[pos.x][pos.y] = 2; cout <<"("<<pos.x<<","<<pos.y<<") "; }
bool PassMaze(Maze maze,Pos start, Pos end) { Man man; //pos di Stack<Man> st; Pos curpos = start; do//重复探索 直至curpos==end找到出口,或者栈变空(没有任何一条通
路) { if(Pass(maze,curpos))//如果当前点curpos能通过 则将man的位置标记到 此点,设置默认探索方向从RIGH开始 {
7.源码
#include <iostream> #include <string>
using namespace std;
template<class Type> class Stack { public: Stack() { capacity = STACK_SIZE; base = new Type[capacity]; top = 0; } ~Stack() { capacity = 0; delete []base; base = NULL; top = 0; } public: bool isfull()const { return top >= capacity; } bool isempty()const { return top == 0;
int main() { Pos start = {0,1}; Pos end = {9,8}; Maze maze = { {1,0,1,1,1,1,1,1,1,1}, {1,0,1,1,1,1,0,0,0,1}, {1,0,1,1,1,1,0,1,1,1}, {1,0,1,0,0,0,0,0,0,1}, {1,0,0,0,1,1,0,1,0,1}, {1,1,1,1,1,1,0,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,0,1,1,0,1}, {1,1,1,0,0,0,0,1,0,1}, {1,1,1,1,1,1,0,0,0,1} }; ShowMaze(maze); if(!PassMaze(maze,start,end)) { cout<<"没有出路!"<<endl; return 0; } cout<<"-------------------"<<endl; ShowMaze(maze);
man.pos = curpos; man.di = RIGHT; //默认从RIGHT开始探索 FootMaze(maze,man.pos); if(curpos == end) return true; st.push(man); curpos = NextPos(man.pos,man.di); } else { if(!st.isempty()) { man = st.gettop(); while(man.di==UP && !st.isempty())//如果curpos不能通过,且man周围 的点都探索完毕,人就往后退 { st.pop(); // MarkMaze(maze,man.pos); if(!st.isempty()) {
return false; }
} if(man.di < UP)//curpos点不通,则继续按方向顺序探索 man周围的下一个点 {
st.pop(); man.di = (DIR)(man.di+1); st.push(man); curpos = NextPos(man.pos,man.di); } } }
switch(di) { case RIGHT:
pos.y += 1; break; case DOWN: pos.x += 1; break; case LEFT: pos.y -= 1; break; case UP: pos.x -= 1; break; } return pos; }
(2)迷宫求解:
bool PassMaze(Maze maze,Pos start, Pos end) {
Man man; //pos di Stack<Man> st; Pos curpos = start; do//重复探索 直至curpos==end找到出口,或者栈变空(没有任何 一条通路) {
if(Pass(maze,curpos))//如果当前点curpos能通过 则将man的位置 标记到此点,设置默认探索方向从RIGH开始
return top >= capacity; } bool isempty()const {
return top == 0; } void push(Type &x) {
if(!isfull()) {
base[top++] = x; } } void pop() { if(!isempty()) {
Pos NextPos(Pos pos, DIR di) { switch(di) { case RIGHT: pos.y += 1; break; case DOWN: pos.x += 1; break; case LEFT: pos.y -= 1; break; case UP: pos.x -= 1; break; } return pos; }
///////////////////////////////////////////// #define ROW 10 #define COL 10
typedef enum { RIGHT=1,
DOWN, LEFT, UP, }DIR;
typedef int Maze[ROW][COL];//10x10的二维数组 模拟迷宫 //表示位置 typedef struct Pos { int x; int y; bool operator==(const Pos &p) { return ((x==p.x)&&(y==p.y)); } }Pos; //模拟人 typedef struct Man { Pos pos; DIR di; }Man;
void ShowMaze(Maze maze) { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) {
cout<<maze[i][j]<<" "; } cout<<endl; } }
bool Pass(Maze maze, Pos pos) { return maze[pos.x][pos.y] == 0; } //将能走通的位置标记为2 void FootMaze(Maze maze,Pos pos) { maze[pos.x][pos.y] = 2; }