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