需求
有一個迷宮,在迷宮的某個出口放着一塊奶酪。將一只老鼠由某個入口處放進去,它必須穿過迷宮,找到奶酪。請找出它的行走路徑。
STEP 1 題目轉化
我們用一個二維數組來表示迷宮,用2表示迷宮的牆壁,用0表示通路。
老鼠每走到一個格子的時候就將該位置的值置為1,表示老鼠的行走路徑包括這個格子。
STEP 2 編程思路
⑴這個題目可以用遞歸方法,只需要最后一步走到迷宮出口所在的格子。
⑵每一步測試上、下、左、右四個方向,選擇一個方向前進。
STEP 3 要點整理
⑴輸出所有路徑的算法與輸出單條路徑相同,需要修改的是:打印函數放入遞歸函數中,才能實現多次輸出。
⑵在遞歸選擇下一步方向時,if條件添加“x < LEN && y < LEN”,避免溢出。
----------------------------------華麗麗的分割線---------------------------代碼君要出場了-------------------
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define LEN 9 5 6 int maze[LEN][LEN] = { 7 {2, 0, 2, 2, 2, 0, 2, 2, 2}, 8 {2, 0, 2, 2, 2, 0, 0, 2, 2}, 9 {2, 0, 0, 0, 0, 0, 0, 0, 2}, 10 {2, 0, 2, 2, 0, 2, 2, 0, 2}, 11 {2, 0, 0, 2, 0, 2, 2, 0, 2}, 12 {2, 0, 0, 2, 0, 2, 2, 0, 2}, 13 {2, 0, 0, 2, 0, 0, 0, 0, 0}, 14 {2, 0, 0, 0, 0, 2, 2, 2, 2}, 15 {2, 0, 2, 2, 0, 2, 2, 2, 2}, 16 }; //構建迷宮 17 18 int start_x = 1, start_y = 0; //設置起點 19 int end_x = 8, end_y = 4; //設置終點 20 21 void step(int x, int y); 22 void print_maze(); 23 24 int main(int argc, char argv[]) 25 { 26 27 printf("maze:\n"); //打印迷宮圖,為方便查看,將數字換為圖形打印 28 print_maze(); 29 30 step(start_x, start_y); 31 32 return 0; 33 } 34 35 36 void step(int x, int y) //用遞歸算法求解路徑 37 { 38 maze[x][y] = 1; 39 40 if(x == end_x && y == end_y) 41 { 42 print_maze(); //打印函數放入遞歸中,每找到一條成功路徑打印一次 43 } 44 45 if(y < (LEN - 1) && maze[x][y + 1] == 0){step(x, y + 1);} //邊界條件,避免溢出,感謝 @別把白天當黑夜 指正 46 if(x < (LEN - 1) && maze[x + 1][y] == 0){step(x + 1, y);} 47 if(y > 0 && maze[x][y - 1] == 0){step(x, y - 1);} 48 if(x > 0 && maze[x - 1][y] == 0){step(x - 1, y);} 49 50 maze[x][y] = 0; 51 } 52 53 void print_maze() 54 { 55 int x, y; 56 57 for(x = 0; x < LEN; x++) 58 { 59 for(y = 0; y < LEN; y++) 60 { 61 if(maze[x][y] == 2) 62 printf("■"); 63 else if(maze[x][y] == 1) 64 printf("☆"); 65 else if(maze[x][y] == 0) 66 printf("□"); 67 } 68 printf("\n"); 69 } 70 71 printf("\n"); 72 }
歡迎轉載,請備注原始連接http://www.cnblogs.com/liuliuliu/p/3885099.html,並注明轉載。
作者bibibi_liuliu,聯系方式395985239@qq.com
