需求
有一個迷宮,在迷宮的某個出口放着一塊奶酪。將一只老鼠由某個入口處放進去,它必須穿過迷宮,找到奶酪。請找出它的行走路徑。
STEP 1 題目轉化
我們用一個二維數組來表示迷宮,用2表示迷宮的牆壁,用0表示通路。
老鼠每走到一個格子的時候就將該位置的值置為1,表示老鼠的行走路徑包括這個格子。
STEP 2 編程思路
⑴這個題目可以用遞歸方法,只需要最后一步走到迷宮出口所在的格子。
⑵每一步測試上、下、左、右四個方向,選擇一個方向前進。
STEP 3 要點整理
⑴走過的格子需要標記,否則無法輸出路徑。
⑵遞歸算法只需弄清遞歸出口(即結束條件)和分解后的問題,切忌想得太深太遠。
----------------------------------華麗麗的分割線---------------------------代碼君要出場了-------------------
1 #include <stdio.h> 2 3 int maze[9][9] = { 4 {2, 2, 2, 2, 2, 2, 2, 2, 2}, 5 {0, 0, 2, 2, 2, 2, 0, 2, 2}, 6 {2, 0, 0, 0, 0, 0, 0, 0, 2}, 7 {2, 0, 2, 2, 0, 2, 2, 0, 2}, 8 {0, 2, 0, 2, 0, 2, 2, 0, 2}, 9 {2, 2, 0, 2, 0, 2, 2, 0, 2}, 10 {2, 2, 0, 2, 0, 0, 0, 0, 2}, 11 {2, 2, 0, 2, 0, 2, 2, 2, 2}, 12 {2, 2, 2, 2, 0, 2, 2, 2, 2}, 13 }; //構建迷宮 14 15 int start_x = 1, start_y = 0; //設置起點 16 int end_x = 8, end_y = 4; //設置終點 17 int success = 0; 18 19 int step(int x, int y); 20 21 int main(int argc, char argv[]) 22 { 23 int x, y; 24 25 printf("maze:\n"); //打印迷宮圖,為方便查看,將數字換為圖形打印 26 for(x = 0; x < 9; x++) 27 { 28 for(y = 0; y < 9; y++) 29 { 30 if(maze[x][y] == 2) 31 printf("■"); 32 else 33 printf("□"); 34 } 35 printf("\n"); 36 } 37 38 if(step(start_x, start_y) == 0) 39 { 40 printf("No way!\n"); 41 } 42 else 43 { 44 printf("You are free!\n"); 45 46 for(x = 0; x < 9; x++) 47 { 48 for(y = 0; y < 9; y++) 49 { 50 if(maze[x][y] == 2) 51 printf("■"); 52 else if(maze[x][y] == 1) 53 printf("☆"); 54 else 55 printf("□"); 56 } 57 printf("\n"); 58 } 59 } 60 61 printf("\n"); 62 return 0; 63 } 64 65 66 int step(int x, int y) //用遞歸算法求解路徑 67 { 68 maze[x][y] = 1; 69 70 if(x == end_x && y == end_y) 71 { 72 success = 1; 73 } 74 75 if(success != 1 && y < (LEN - 1) && maze[x][y + 1] == 0){step(x, y + 1);} 76 if(success != 1 && x > 0 && maze[x][y - 1] == 0){step(x, y - 1);} 77 if(success != 1 && x < (LEN - 1) && maze[x + 1][y] == 0){step(x + 1, y);} 78 if(success != 1 && y > 0 && maze[x - 1][y] == 0){step(x - 1, y);} 79 80 if(success != 1) 81 { 82 maze[x][y] = 0; 83 } 84 85 return success; 86 }
歡迎轉載,請備注原始連接http://www.cnblogs.com/liuliuliu/p/3885026.html,並注明轉載。
作者bibibi_liuliu,聯系方式395985239@qq.com