定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。程序如下:
//By LYLtim #include<stdio.h> #include<stdlib.h> const char Di[4] = {0,1,0,-1}, Dj[4] = {1,0,-1,0}; char maze[5][5] = { 2, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0}, ip = 0; struct {char i, j;} path[23]; void print_maze(void) { char i, j; for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) printf("%hd ", maze[i][j]); putchar('\n'); } printf("*********\n"); } void print_path(void) { char i = 0; printf("(0,0)"); for (i = 0; i < ip; i++) printf("->(%hd,%hd)", path[i].i, path[i].j); exit(0); } void try(char i, char j) { char k; for (k = 0; k < 4; k++) { char Ni = i + Di[k], Nj = j + Dj[k]; if (Ni >= 0 && Ni <5 && Nj >= 0 && Nj < 5 && maze[Ni][Nj] == 0) { maze[Ni][Nj] = 2; path[ip++].i = Ni; path[ip].j = Nj; print_maze(); if (Ni == 4 && Nj == 4) print_path(); else try(Ni, Nj); maze[Ni][Nj] = 0; path[--ip].i = 0; path[ip].j = 0; } } } int main(void) { try(0, 0); return 0; }
运行结果如下:
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)