1. 程式人生 > >回溯問題三:迷宮問題

回溯問題三:迷宮問題

題意:
0 0 0 0 1
1 0 0 0 1
1 0 1 0 1
1 0 1 1 1
1 0 0 1 1
上面矩陣表示一個迷宮,其中的1表示牆壁,0表示可以走的路,現在編寫程式從(0,0)開始走從最後一行有出口處走出

解題方法:回溯法,與全排列、地圖塗色如出一轍

#include <stdio.h>
#define N 5 //迷宮大小
int Maze[N][N] =
{
    {0,0,0,0,1},
    {1,0,0,0,1},
    {1,0,1,0,1},
    {1,0,1,1,1},
    {1,0,0,1,1}
};
int direction[4][2] = {{-1, 0}, {1, 0}
, {0, -1}, {0, 1}}; //四個方向,上下左右,每個方向x、y的增量 int count = 0;//記錄方案數 int Check(int i, int j) //判斷下一步是不是通路 { if(i >= 0 && i<=4 && j >= 0 && j <= 4) { if(0 == Maze[i][j]) { return 1; } } return 0; } void Find(int ci, int cj) {
int n; if(N-1 == ci) //到了最後一行,先搞定,再輸出 { Maze[ci][cj] = 6; printf("\n解法%d:\n", ++count); int i, j; for(i=0; i<N; ++i) { for(j=0; j<N; ++j) { printf("%d ", Maze[i][j]); } printf("\n")
; } Maze[ci][cj] = 0; } else { for(n=0; n<4; ++n)///四個方向 { if(Check(ci+direction[n][0], cj+direction[n][1])) //依然用Check實現判斷:是否可以在某個方向走下一步 { Maze[ci][cj] = 6; //6表示走過的路 Find(ci+direction[n][0], cj+direction[n][1]); Maze[ci][cj] = 0; //回溯恢復值,與全排列、地圖塗色等回溯恢復原理一樣 } } } } int main(void) { printf("\n--------------------迷宮問題(1表示牆壁 0 道路 6 路徑)--------------------\n\n"); //(0, 0)為起點 printf("原始迷宮:\n"); int i, j; for(i=0; i<N; ++i) { for(j=0; j<N; ++j) { printf("%d ", Maze[i][j]); } printf("\n"); } printf("\n"); Find(0, 0); printf("\n\n共%d種方案!\n",count); return 0; }

如有問題,QQ:3172683713共聊