回溯問題三:迷宮問題
阿新 • • 發佈:2018-11-30
題意:
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共聊