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

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

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

上天完全是为了坚强你的意志,才在道路上设下重重的障碍。

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

相关文章:

你感兴趣的文章:

标签云: