用回溯法走迷宫,较简易代码

这应该算是第一份回溯写迷宫的代码,寒假写的时候出了点小毛病一直显示找不到路径,连续几天都没有思绪,后面来学校在学霸的帮助下发现了原因

在main函数里定义了offset数组,在外面又同时定义了一个数组,结果在seekpath函数里面调用的是外面定义的那个,外面定义的没赋值。。结果就一直。。

#include<iostream>
#include<cstdio>
using namespace std ;
const int m = 4 , p = 4 ;
struct offsets {
	int a , b ;
	char *dir ;
};
struct point {
	int x ;
	int y ;
}aa[6][6] ;
int kk = 1 ;
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"}} ;
int Maze[m+2][p+2];
int mark[m+2][p+2];
void print_path(int x,int y) {
	if(x == 1 && y == 1){
		printf("1 1\n");
		return;
	}
	else
		print_path(aa[x][y].x , aa[x][y].y);
	printf("%d %d\n",x,y);
}
int SeekPath (int x ,int y  ) {
	int i ,g ,h ;
	char *d;
	if(x == m && y == p) {
		print_path(m,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) {
			aa[g][h].x = x;
			aa[g][h].y = y;
			mark[g][h] = 1 ;
			if (SeekPath (g,h)) {
				return 1;
			}
			mark[g][h] = 0;//回溯,路径走不通但是上个点可以跑
			aa[g][h].x = 0;
			aa[g][h].y = 0;
		}
	}
	return 0;
};

void main (void){
	int i , j;
	for(i = 0 ;i< m+2 ;i++) {
		for(j=0;j<p+2 ;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)){
	}
	else
		printf("no\n");
};
时间: 2024-11-18 23:58:41

用回溯法走迷宫,较简易代码的相关文章

C++回溯法走迷宫

#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}, {1,0,

回溯法求迷宫问题

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”.本文使用回溯法求解迷宫问题迷宫问题,有一个m行n列的矩阵代表迷宫,1代表此路不通,0代表此路通.指定入口和出口,判断是否能从入口进,从出口走出.此程序只判断从路口到出口是否能走通,找到的路不一定是最短路(最短路的程序在下一篇中使用BFS算法给出),注意:从入口到

算法学习之【回溯法】--迷宫问题

题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 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, }; 表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线.入口点为[0,0],即第一空格是可以走的路. Input 一个N 

回溯法解决迷宫问题

现在有迷宫地图:(回溯法) 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 将迷宫地图存于文件中,将文件里的信息依次读入到二维数组中,设置入口,先将

回溯法找迷宫最短路径

有一个二维数组,0表示路,-1表示墙,求其中任意两点的最短路径 我们先看,怎么求一条路径:求两点路径是一个数据结构上的典型的迷宫问题,解决办法如下: 从一点开始出发,向四个方向查找(上,右,下,左),每走一步,把走过的点的值+1,防止重复行走,并把走过的点压入堆栈(表示路径),如果遇到墙.或者已走过的点则不能前进,如果前方已经无路可走,则返回,路径退栈,这样递归调用,直到找到终点为止. 如果我们调整查找的顺序,改为左.右.上.下,可能会得到更短的路径,但这种方法不能保证一定是最短路径. 经过网上

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

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

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

迷宫问题(MazePath)的求解--利用回溯法(backtracking) 1. 迷宫问题的提法 迷宫问题是典型的图的搜索问题. 假设一个迷宫,只有一个入口和一个出口.如果从迷宫的入口到达出口,途中不出现行进方向错误,则得到一条最佳路线. 为此,用一个二维数组maze[m][p]来表示迷宫. (1)当数组元素maze[i][j]=1 (0≤i≤m-1,1≤j≤p-1),表示该位置是墙壁,不能通行. (2)当数组元素maze[i][j]=0 (0≤i≤m-1,1≤j≤p-1),表示该位置是通路,

回溯法-01背包问题之二:顺序执行模式

上文已讲述了回溯法以及01背包问题的原理,本文讲述如何顺序执行解决01背包问题以及通过模板模式重构软件. 一.顺序执行流程图 图1无剪枝函数的01背包问题顺序执行算法流程图 图2 有剪枝函数的01背包问题顺序执行算法流程图 无剪枝函数是通用的深度遍历算法,为了减少搜索深度可通过剪枝函数处理完全不可能的分枝.与递归方案的区别主要表现在i>=n后需要"回溯",即用后进先出的方式将物品逐个拿出. 二.执行代码 递归与顺序执行方法仅仅是实现方法Backtracking(int i)不同,

看数据结构写代码(33) 树与回溯法(一) 子集树

回溯法 是 一种 在 穷举 中,裁剪 不满足 条件 的 分支,已达到 提高 效率的 方法.其基本原型 是 树的 先序遍历,从 树根 到 树叶的路径 是 问题的 一个 解. 回溯法的基本框架 =  确定 解空间 + 深度优先遍历 + 裁剪函数 + 确定结果函数 其中 解空间,分为 子集树 和 排序树. 具体 概念 详解:参考 点击打开链接  和 点击打开链接 递归算法通用 模板如下: 回溯法对解空间作深度优先搜索,因此,在一般情况下用递归方法实现回溯法. // 针对N叉树的递归回溯方法 void