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

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

在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");
};


    原文作者:回溯法
    原文地址: https://blog.csdn.net/hhooong/article/details/44035005
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞