struct-关于使用回溯法求解迷宫问题

问题描述

关于使用回溯法求解迷宫问题

#include
using namespace std ;
const int m = 4 , p = 4 ;
struct offsets {
int a , b ;
char *dir ;
};
offsets move[8] ;
int Maze[m+2][p+2] ;
int mark[m+2][p+2] ;
int main (){
int i , j;
int SeekPath (int x ,int y ) ;
offsets move[8] = {{-1,0,"N"},{-1,1,"NE"},{0,1,"E"},{1,1,"SE"},{1,0,"S"},{1,-1,"SW"},{0,-1,"W"},{-1,-1,"NW"}} ;
for(i = 0 ;i< m+2 ;i++) {
for(j=0;j

cin >> Maze[i][j] ;
}
}
for(i = 0 ;i < m+2 ;i++) {
for(j = 0;j<p+2 ;j++) {
mark[i][j] = 0 ;
}
}
mark[1][1] = 1 ;
if(SeekPath(1,1)) {
cout << "(" << 1 << "," << 1 << ") ," << "dir" << "E" <<endl;
}
}

int SeekPath (int x ,int y ) {
int i ,g ,h ;
char *d;
if(x == m && y == p) return 1 ;
for(i = 0 ;i < 8 ;i++) {
g = x+ move[i].a ;
h = y+ move[i].b ;
d = move[i].dir ;
if(Maze[g][h] == 0 && mark[g][h] == 0) {
mark[g][h] = 1 ;
if (SeekPath (g,h)) {
cout << "(" << g <<"," << h <<")," << "dir" <<" ," ;
return 1 ;
}
}
}
if(x == 1 && y== 1 ) cout << "no path in Maze " <<endl ;
return 0 ;

}

不知道为何输入地图进去后总是显示 "no path in Maze"
两天了实在找不到问题在哪,希望能有大神帮忙指点

解决方案

来个大神啊 = = 实在不知道哪里出问题了,改了好几遍了

解决方案二:

注释不够详细,不过粗略看一下,按照递归来说,递归前后状态应该得一致。

 mark[g][h] = 1 ;
if (SeekPath (g,h)) {
cout << "(" << g <<"," << h <<")," << "dir" <<" ," ;
return 1 ;
}

想这段代码,一段返回0,那mark[g][h]状态就一直是1,后续及时递归回去,这个节点的状态就不会变。

时间: 2024-10-31 22:41:02

struct-关于使用回溯法求解迷宫问题的相关文章

回溯法——求解0-1背包问题

         以前研究过一个简单的N皇后问题,对回溯法也有了个模糊的认识,大致理解就是:先一直做某件事,当完成某个条件时或者是触犯某个条件时,再返回到最近的一个类似还原点的地方.        在用回溯法求解0-1背包问题的时候,主要遇到三个相对难解决的问题:1,什么是界限函数:2,什么时候用它:3,回溯到哪儿.    什么是界限函数?         如下图:             当我们身在一棵搜索空间树中,站在一个K点举棋不定的时候,我们可以用它估算如果我们继续向下走,我们走完本段路

并行计算思考----回溯法求解数独问题

 1.Intel Parallel Studio 环境下的并行程序设计 书官方网站的详情页: http://www.wrox.com/WileyCDA/WroxTitle/Parallel-Programming-with-Intel-Parallel-Studio-XE.productCd-0470891653.html 可以下载相关代码 2.在使用并行计算来优化自己的串行程序之前,我们需要思考以下几个方面的问题 什么情况下需要并行? 并行能够带来多少性能的提升? 编码和调试的时间成本?

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

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  问题: 参考代码: #include <iostream> #include <iomanip> #include <cstdlib> using namespace std; #define MaxSize 100 int maze[10][10] =

回溯法——求解N皇后问题

问题描述       八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上.可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行.同一列或同一斜线上.     问题分析       我们以最简单的4皇后问题分析,显然,为了使皇后不相互攻击,首先考虑每一行只能放一个皇后,我们以X[1,2,3-.N]代表此问题的解数组,X[N]代表在第N行第X[

java使用回溯法求解数独示例_java

复制代码 代码如下: import java.util.Calendar;import java.util.Date; public class Matrix {  private int matrix[][]; private long timeAfter=0;  private long timeBefore =0; public Matrix(int m[][]) {  matrix = new int[9][9];  for (int i=0; i<9 ; i++)   for(int

回溯法 -数据结构与算法

1.回溯法算法思想:   定义:         回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为"回溯点". 1.回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解时,往往要使用回溯法. 2.有组织的穷举式搜索:回溯法的基本做法是搜索或者有的组织穷尽搜索.它能避免搜索所有的可能

C++回溯法实例分析_C 语言

本文实例讲述了C++的回溯法,分享给大家供大家参考之用.具体方法分析如下: 一般来说,回溯法是一种枚举状态空间中所有可能状态的系统方法,它是一个一般性的算法框架. 解向量a=(a1, a2, ..., an),其中每个元素ai取自一个有限序列集Si,这样的解向量可以表示一个排列,其中ai是排列中的第i个元素,也可以表示子集S,其中ai为真当且仅当全集中的第i个元素在S中:甚至可以表示游戏的行动序列或者图中的路径. 在回溯法的每一步,我们从一个给定的部分解a={a1, a2, ..., ak}开始

C语言使用回溯法解旅行售货员问题与图的m着色问题_C 语言

旅行售货员问题 1.问题描述: 旅行售货员问题又称TSP问题,问题如下:某售货员要到若干个城市推销商品,已知各城市之间的路程(或旅费),他要选定一条从驻地出发,经过每个城市一遍最后回到驻地的路线,使总的路线(或总的旅费)最小.数学模型为给定一个无向图,求遍历每一个顶点一次且仅一次的一条回路,最后回到起点的最小花费. 2.输入要求: 输入的第一行为测试样例的个数T( T < 120 ),接下来有T个测试样例.每个测试样例的第一行是无向图的顶点数n.边数m( n < 12,m < 100 )

python 回溯法 子集树模板 系列 —— 2、迷宫问题

问题 给定一个迷宫,入口已知.问是否有路径从入口到出口,若有则输出一条这样的路径.注意移动可以从上.下.左.右.上左.上右.下左.下右八个方向进行.迷宫输入0表示可走,输入1表示墙.为方便起见,用1将迷宫围起来避免边界问题. 分析 考虑到左.右是相对的,因此修改为:北.东北.东.东南.南.西南.西.西北八个方向.在任意一格内,有8个方向可以选择,亦即8种状态可选.因此从入口格子开始,每进入一格都要遍历这8种状态. 显然,可以套用回溯法的子集树模板. 注意,解的长度是不固定的. 图片来源:点我 代