回溯法解决迷宫问题

原创 2016年05月30日 10:46:59

现在有迷宫地图:(回溯法)

1 1 1 1 1 1 1 1 1 1

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 1 1 1 1 1 1 1

1 1 0 1 1 1 1 1 1 1

1 1 0 0 0 0 0 0 1 1

1 1 0 1 1 1 1 0 1 1

1 1 0 1 1 1 1 0 1 1

1 1 0 1 1 1 1 1 1 1

  将迷宫地图存于文件中,将文件里的信息依次读入到二维数组中,设置入口,先将其压栈,然后将其设置为2,以便于进行回溯操作,然后进行上下左右这四个方位的试探,如果试探到这个地方的值为0就满足条件,先将其压栈,再将其置为2,依次类推。如果第一次没有找到通路则进行回溯操作,直到找到通路。

#define N 10
using namespace std;
struct Pos
{
int _row;
int _col;
};

void GetMaze(int* arr,int n)//将二维数组改成一维数组形式使用
{
FILE* fp=fopen("MazeMap.txt","r");
assert(fp);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n;)
{
char ch = fgetc(fp);
if (ch == '1' || ch == '0')
{
arr[i*n + j] = ch-'0';
j++;
}
else
{
continue;
}
}
}
}
void PrintMaze(int* arr, int n)
{
for(int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << arr[i*n + j] << " ";
}
cout << endl;
}
}
bool Isviable(int* arr, int n, Pos cur, int row,int col)//检查相应位置是否为0
{
if (arr[n*row + col] == 0 && row < n&&row >= 0 && col < n&&col >= 0)
{
return true;
}
else
{
return false;
}
}
bool GetPath(int* arr,int n,const Pos& entry,stack<Pos>& path)
{
Pos cur = entry;
path.push(cur);
while (!path.empty())
{
arr[cur._row*n + cur._col] = 2;//将走过的路径置为2
if (cur._row == n - 1)
{
return true;
}
//上
Pos next = cur;
next._row--;
if (Isviable((int*)arr, n, next, next._row, next._col))
{
cur = next;
path.push(cur);
continue;
}

//下
next = cur;
next._row++;
if (Isviable((int*)arr, n, next, next._row, next._col))
{
cur = next;
path.push(cur);
continue;
}
//左
next = cur;
next._col--;
if (Isviable((int*)arr, n, next, next._row, next._col))
{
cur = next;
path.push(cur);
continue;
}
//右
next = cur;
next._col++;
if (Isviable((int*)arr, n, next, next._row, next._col))
{
cur = next;
path.push(cur);
continue;
}
return false;
cur = path.top();//回溯
path.pop();
}
return false;//原路返回,并检测出没有通路
}
/***************************************/
void testMaze()
{
int arr[N][N] = {};
GetMaze((int*)arr, N);//将二维数组转换成一维数组操作
PrintMaze((int*)arr, N);
stack<Pos> path;
Pos entry = { 2, 0 };//开始入口地方
cout<<GetPath((int*)arr, N,entry,path)<<endl;
PrintMaze((int*)arr, N);
}


wKiom1cLYi2TuoXRAAAa6r1pWFU264.png

可以进行别的方案解决,递归法

本文出自 “anser” 博客,请务必保留此出处http://674353165.blog.51cto.com/10786549/1762660

版权声明:本文为博主原创文章,未经博主允许不得转载。

迷宫问题——回溯法解

题目描述    迷宫是一个二维矩阵,其中1为墙,0为路,入口在第一列,出口在最后一列。     要求从入口开始,从出口结束,按照 上,下,左,右 的顺序来搜索路径...
  • zhuofeilong
  • zhuofeilong
  • 2015年08月31日 10:53
  • 4766

回溯算法解迷宫问题(C语言)

回溯法也称为试探法,该方法首放弃关于问题规模大小的限制,并将问题的候选解按某一顺序逐一枚举和试验.当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其...
  • diaoguangqiang
  • diaoguangqiang
  • 2013年11月26日 09:45
  • 1120

C++抽象编程——回溯算法(1)——迷宫问题

这部分内容其实是递归策略的一部分,但是里面涉及到了一些面向对象的知识,所以我就先总结了面向对象那一部分。这部分内容不得不说还是很有意思的。迷宫问题曾经在希腊神话时代,地中海的克里特岛被一个名叫米诺斯的...
  • redRnt
  • redRnt
  • 2017年05月08日 12:42
  • 1061

回溯法找迷宫最短路径

有一个二维数组,0表示路,-1表示墙,求其中任意两点的最短路径 我们先看,怎么求一条路径:求两点路径是一个数据结构上的典型的迷宫问题,解决办法如下: 从一点开始出发,向四个方向查找(上,右,下,左...
  • liyuan_669
  • liyuan_669
  • 2014年09月21日 22:46
  • 3136

【数据结构】用回溯法求解迷宫问题

今天呢,让我们来用栈求解一下数据结构中的著名问题---迷宫问题 我们先“制造”一个迷宫,把它放在Maze.txt文件中 Maze.txt 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
  • qq_31828515
  • qq_31828515
  • 2016年11月30日 11:09
  • 2985

回溯法求迷宫问题

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足...
  • yang_teng_
  • yang_teng_
  • 2015年10月15日 11:02
  • 1016

2014秋C++第19周 补充代码 回溯法走迷宫

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 问题...
  • sxhelijian
  • sxhelijian
  • 2015年01月07日 21:20
  • 3678

回溯法解决迷宫问题(方法1---递归)

一、解决思路 1.创建迷宫,用0表示无障碍位置,1表示墙壁,比如迷宫m*p表示m行、p列,用二维数组Maze[m][p].但为了边缘处能够方便处理,在迷宫外层加一层几乎都为1的墙壁,除了进口和入口处设...
  • qq1169091731
  • qq1169091731
  • 2016年04月11日 20:38
  • 442

迷宫问题(MazePath)的求解——利用回溯法(backtracking)

迷宫问题(MazePath)的求解——利用回溯法(backtracking) 1. 迷宫问题的提法 迷宫问题是典型的图的搜索问题。 假设一个迷宫,只有一个入口和一个出口。如果从迷宫的入口到达出口,...
  • cainv89
  • cainv89
  • 2016年05月25日 23:07
  • 6658

poj 3984 迷宫问题(BFS+回溯)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11256   Accepted: 6733 ...
  • lh__huahuan
  • lh__huahuan
  • 2015年08月06日 17:11
  • 554
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回溯法解决迷宫问题
举报原因:
原因补充:

(最多只允许输入30个字)