迷宫:找到通路

找到通路

1 1 1 1 1 1 1 1 1 1
0 0 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 0 0 1 1 1 1 1
1 1 0 1 0 1 1 1 1 1
1 1 0 1 0 1 1 1 1 1
1 1 0 1 0 1 1 1 1 1
1 1 0 1 0 1 1 1 1 1
1 1 0 1 0 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1

#include<iostream>
#include<cassert>
#include<stack>
using namespace std;
struct pos
{
 int row;
 int col;
};
stack<pos> paths;
void CreateMaze(int* maze,int m,int n)
{
 FILE* fout = fopen("Maze.txt", "r");
 assert(fout);
 for (int i = 0; i < m; ++i)
 {
  for (int j = 0; j < n; ++j)
  {
   char ch = fgetc(fout);
   if (ch == ‘0‘ || ch == ‘1‘)
    maze[i*n + j] = ch - ‘0‘;
   else
    --j;
  }
 }
 fclose(fout);
}
void Display(int *maze, int m, int n)
{
 for (int i = 0; i < m; ++i)
 {
  for (int j = 0; j < n; ++j)
  {
   cout << maze[i*n + j] << " ";
  }
  cout << endl;
 }
 cout << endl;
}
bool CheckAccess(int *maze,int m, int n,pos &  p)
{
 if ((p.row < 0 || p.row >= m || p.col < 0 || p.col >= n) || maze[p.row*n + p.col] != 0)
  return false;
 return true;
}
bool GetPath(int *maze, int m, int n, const pos& entry)
{
 paths.push(entry);
 while (!paths.empty())
 {
  pos cur = paths.top();
  maze[cur.row*n + cur.col] = 2;
  if (cur.row == m - 1)
   return true;
  pos next = cur;
  //上
  next.col -= 1;
  if (CheckAccess(maze, m, n, next))
  {
   paths.push(next);
   continue;
  }
  //下
  next.col += 2;
  if (CheckAccess(maze, m, n, next))
  {
   paths.push(next);
   continue;
  }
  next.col -= 1;
  next.row -= 1;
  if (CheckAccess(maze, m, n, next))
  {
   paths.push(next);
   continue;
  }
  next.row += 2;
  if (CheckAccess(maze, m, n, next))
  {
   paths.push(next);
   continue;
  }
  paths.pop();
 }
 return false;
}
void Test1()
{
 int maze[10][10];
 CreateMaze((int*)maze, 10, 10);
 Display((int*)maze, 10, 10);
 pos p;
 p.row = 1;
 p.col = 0;
 if (GetPath((int*)maze, 10, 10, p))
 {
  while (!paths.empty())
  {
   cout << "(" << paths.top().row << "," << paths.top().col << ")->";
   paths.pop();
  }
 }
}
时间: 2024-08-01 06:21:21

迷宫:找到通路的相关文章

初级版迷宫问题(栈的应用)

  /*  (一)初级迷宫问题:   0:代表通   1:代表不通   求迷宫的通路  (二)步骤:   1.创建迷宫      * 从文件中读取迷宫      * 开辟二维数组存放迷宫   2.寻找通路      * 检查某位置是否为通      * 出口位置判断      * 走过的路用2标记      * 利用栈回溯  (三)问题   1.解决回溯中重复探测:递归   2.最优解:迷宫的最短通路 */ #include <iostream> #include <stdlib.h&g

一个搜索迷宫出路的程序

/*1.定义一个结构体position 结构体中包括一个方块的行列号和下一个 可走方块的方位号 2.定义一个结构体. 包括一个一个position结构体,一个栈顶指针 3.定义入栈.出栈.取栈顶函数 4.定义迷宫, 0:不通 1:通路 -1:已经走过的路,每次入栈后将位置改为-1,表示已经走过 默认最外围是墙,(1.1)是入口,(ROW-2.COL-2)是出口 5.解迷宫: 1)入口进栈, 2)进入while循环.结束条件为栈空 { 推断当前位置是否为出口.是,打印路径.结束 不是,依照上,右.

Java数据结构之回溯算法的递归应用迷宫的路径问题

一.简介 回溯法的基本思想是:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法.当搜索到某个结点.发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的分支:如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程:这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止. 该方法可以使用堆栈实现.也可以使用递归实现,递归实现的话代码比较简单,

算法:老鼠走迷宫问题

算法:老鼠走迷宫问题(初) [写在前面] 老鼠走迷宫问题的递归实现,是对递归思想的一种应用. [问题描述] 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图.给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路. [代码] 对题目的描述部分 int migo[7][7]={ {2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 0, 2, 0, 2}, {2, 0, 0, 0, 0, 2, 2},

[迷宫中的算法实践]迷宫生成算法&mdash;&mdash;Prim算法

       普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该算法.因此,在某些场合,普里姆

C语言编写的迷宫小游戏

C语言编写的迷宫小游戏 #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> #define N 20/*迷宫的大小,可改变*/ int  oldmap[N][N];/*递归用的数组,用全局变量节约时间*/ int  yes=0;/*yes是判断是否找到路的标志,1找到,0没找到*/ int  way[100

c++:迷宫问题的实现

Maze.cpp #define  _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<stack> using namespace std; #define N 10            //定义数组大小 struct Pos{            //定义结构体保存路径的坐标  size_t _row;       //行  size_t _col;       //列 }; stack <Pos> min

二十四周项目二--回溯法之走迷宫

问题: 代码: #include <iostream> #include <iomanip> #include <cstdlib> using namespace std; #define MaxSize 100 int maze[10][10] = //定义一个迷宫,0表示通道,1表示墙 { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,1,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1

第二十四周项目2-回溯法走迷宫

问题: 迷宫问题中,在寻找路径时,采用的方法通常是:从入口出发,沿某一方向向前试探,若能走通,则继续向前进:如果走不通,则要沿原路返回,换一个方向再继续试探,直到所有可能的能跟都试探完成为止.为了保证在任何位置上都能沿原路返回(回溯),要建立一个后进先出的栈来保存从入口到当前位置的路径. 而且在求解迷宫路径中,所求得的路径必须是简单路径.即在求得的路径上不能有重复的同一块通道. 为了表示迷宫,设置一个数组,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,数组如下