1、感觉和之前我编的熊搬家问题差不多,就是没有打印出路径结果而已,熊搬家知识输出有没有路径,这里把(0,0)(3,3)分别设为出发点和目标点,可以根据实际情况重新设定;还是递归归根到底。
2、还有就是结构体数组要学会去用。
// 4*4 迷宫 深度优先搜索求解
// 4*4数组中,1代表通路,0代表障碍,2代表一条可行路径
#include <stdio.h>
char maze[4][4] = { {1, 1, 1, 1}, {0, 1, 0, 1}, {0, 1, 0, 1}, {0, 1, 1, 1} };
typedef struct {
char x, y;
} COORD;
COORD dir[4] = { {0, 1}, {0, -1}, {1, 0}, { -1, 0} };//结构体数组赋初值,表示dir[0].x=0,dir[0].y=1.....
COORD path[16]; //表示结构体数组path[0]-path[15],每一个path[]又有一个结构体path[].x、path[].y
void maze_print( void )
{
int i, j;
for ( i = 0; i < 4; i++ ) {
for ( j = 0; j < 4; j++ )
printf( "%2d", maze[i][j] );
printf( "\n" );
}
printf( "--------\n" );
}
void maze_try( int k )//也用到了递归,不过这里在每找到一条路径后会打印出结果来
{
int i;
if ( path[k].x == 3 && path[k].y == 3 )//终点(3,3)
{
maze_print();//找到终点打印出结果来
return;
}
for ( i = 0; i < 4; i++ )
{
path[k + 1].x = path[k].x + dir[i].x;
path[k + 1].y = path[k].y + dir[i].y;//四个方向移动坐标
if ( path[k + 1].x >= 0 && path[k + 1].x < 4 &&
path[k + 1].y >= 0 && path[k + 1].y < 4 &&
maze[path[k + 1].x][path[k + 1].y] == 1 ) //四个方向移动坐标后判断是否出界,出界则这个方向无效
{
maze[path[k + 1].x][path[k + 1].y] = 2;
maze_try( k + 1 );
maze[path[k + 1].x][path[k + 1].y] = 1;
}
}
}
int main( void )
{
printf ( "Origin:\n" );
maze_print();
path[0].x = 0;
path[0].y = 0;
maze[0][0] = 2;//出发点,也可以寻找这点并设为初值(0,0),其实2就是路线的标记
maze_try( 0 );
return 0;
}