用深度优先搜索解迷宫问题

定义一个二维数组:
int maze[5][5] = {
	0, 1, 0, 0, 0,
	0, 1, 0, 1, 0,
	0, 0, 0, 0, 0,
	0, 1, 1, 1, 0,
	0, 0, 0, 1, 0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。程序如下:

[cpp]  view plain copy
  1. //By LYLtim  
  2.   
  3. #include<stdio.h>  
  4.   
  5. const int di[4] = {0,1,0,-1},  
  6.           dj[4] = {1,0,-1,0};  
  7.   
  8. unsigned maze[5][5] = {  
  9.     2, 1, 0, 0, 0,  
  10.     0, 1, 0, 1, 0,  
  11.     0, 0, 0, 0, 0,  
  12.     0, 1, 1, 1, 0,  
  13.     0, 0, 0, 1, 0},  
  14.     ip = 0;  
  15.   
  16. struct { int i, j; } path[23] = {0};  
  17.   
  18. void print_maze(void)  
  19. {  
  20.     int i, j;  
  21.     for (i = 0; i < 5; i++) {  
  22.         for (j = 0; j < 5; j++)  
  23.             printf("%d ", maze[i][j]);  
  24.         putchar('\n');  
  25.     }  
  26.     printf("*********\n");  
  27. }  
  28.   
  29. void print_path(void)  
  30. {  
  31.     int i = 0;  
  32.     printf("(0,0)");  
  33.     for (i = 0; i < ip; i++)  
  34.         printf("->(%d,%d)", path[i].i, path[i].j);  
  35.     exit(0);  
  36. }  
  37.   
  38. void try(int i, int j)  
  39. {  
  40.     int k;  
  41.     for (k = 0; k < 4; k++)  
  42.         if (i + di[k] >= 0 && i + di[k] <5  
  43.             && j + dj[k] >= 0 && j + dj[k] < 5  
  44.             && maze[i + di[k]][j + dj[k]] == 0) {  
  45.                 maze[i + di[k]][j + dj[k]] = 2;  
  46.                 path[ip++].i = i + di[k]; path[ip].j = j + dj[k];  
  47.                 print_maze();  
  48.                 if (i + di[k] == 4 && j + dj[k] == 4)  
  49.                     print_path();  
  50.                 else  
  51.                     try(i + di[k], j + dj[k]);  
  52.                 maze[i+di[k]][j+dj[k]] = 0;  
  53.                 path[--ip].i = 0; path[ip].j = 0;  
  54.         }  
  55. }  
  56.           
  57.   
  58. int main(void)  
  59. {  
  60.     try(0, 0);  
  61.     return 0;  
  62. }  

运行结果如下:

2 1 0 0 0 
2 1 0 1 0 
0 0 0 0 0 
0 1 1 1 0 
0 0 0 1 0 
*********
2 1 0 0 0 
2 1 0 1 0 
2 0 0 0 0 
0 1 1 1 0 
0 0 0 1 0 
*********
2 1 0 0 0 
2 1 0 1 0 
2 2 0 0 0 
0 1 1 1 0 
0 0 0 1 0 
*********
2 1 0 0 0 
2 1 0 1 0 
2 2 2 0 0 
0 1 1 1 0 
0 0 0 1 0 
*********
2 1 0 0 0 
2 1 0 1 0 
2 2 2 2 0 
0 1 1 1 0 
0 0 0 1 0 
*********
2 1 0 0 0 
2 1 0 1 0 
2 2 2 2 2 
0 1 1 1 0 
0 0 0 1 0 
*********
2 1 0 0 0 
2 1 0 1 0 
2 2 2 2 2 
0 1 1 1 2 
0 0 0 1 0 
*********
2 1 0 0 0 
2 1 0 1 0 
2 2 2 2 2 
0 1 1 1 2 
0 0 0 1 2 
*********
(0,0)->(1,0)->(2,0)->(2,0)->(2,1)->(2,2)->(2,3)->(3,4)->(4,4)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值