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