用回溯法遞歸實現迷宮

#include
#define N 19//整個迷宮大小(包括最外層牆壁)


char Maze[N][N] = {
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
{ 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1 },
{ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};
char step[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };   //定義四個方向
int count = 0;


char Check(char i, char j)  //判斷下一步是不是通路
{
if (i >= 0 && i <= 18 && j >= 0 && j <= 18)
{
if (0 == Maze[i][j])
{
return 1;
}
}
return 0;
}


void Display(void)
{
char i, j;


for (i = 0; i<N; ++i)
{
for (j = 0; j<N; ++j)
{
printf("%d", Maze[i][j]);
}
printf("\n");
}
}


void Find(char ci, char cj)
{
char n;
if ((N - 1) == cj) //這個邊界設置得比較粗糙,到N-1這個下標就算終點,沒想到什麼好的辦法
{
Maze[ci][cj] = 6;   //終點的最後一個6
printf("解法%d(Enter回車查看下一解法):\n", ++count);
Display();
getchar();
Maze[ci][cj] = 0;
}
else
{
for (n = 0; n<4; ++n)
{
if (Check(ci + step[n][0], cj + step[n][1])) //依然用Check實現判斷:是否可以在某個方向走下一步
{
Maze[ci][cj] = 6;   //6表示走過的路
Find(ci + step[n][0], cj + step[n][1]);
Maze[ci][cj] = 0;   //傳統回溯方法
}
}
}
}


int main(void)
{
printf("\t迷宮問題(1 牆壁 0 道路 6 解法)\n\n");
printf("原迷宮(Enter回車查看解法):\n");
Display();
getchar();


//(17, 0)爲起點
Find(17, 0);


return 0;

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章