走迷宮問題
1、介紹
在nxn的方格里填上1和0,其中0表示路可通,1表示牆(不可通),走迷宮就是在一個起始點開始,從上下左右四個方向尋找爲0的方格走,若有多條路,擇最優的路徑。下面帶來的是8x8的迷宮,並輸出一個最優解的路徑。
2、代碼
#include<stdio.h>
#define N 8 //迷宮大小
int maze[N][N] = {{0, 0, 0, 0, 0, 0, 0, 0}, //迷宮
{0, 1, 1, 1, 1, 0, 1, 0},
{0, 0, 0, 0, 1, 0, 1, 0},
{0, 1, 0, 0, 0, 0, 1, 0},
{0, 1, 0, 1, 1, 0, 1, 0},
{0, 1, 0, 0, 0, 0, 1, 1},
{0, 1, 0, 0, 1, 0, 0, 0},
{0, 1, 1, 1, 1, 1, 1, 0}};
int fx[4] = {1, 0, -1, 0},
fy[4] = {0, 1, 0, 1}; //用來表示該點四個方向的下一個點
struct { //隊列存儲結構
int x;
int y;
int pre;
} sq[N * N];
int qh, qe; //表示隊列頭尾
int check(int i, int j) {
int flag = 1;
if (i < 0 || i > 7 || j < 0 || j > 7) //判斷越界
flag = 0;
if (maze[i][j] == 1 || maze[i][j] == -1) //maze[i][j]=1,該點不通,爲0可通,爲-1已經訪問過
flag = 0;
return flag;
}
void output() { //輸出可通路的x、y座標
printf("(%d,%d) ", sq[qe].x, sq[qe].y);
while (sq[qe].pre != 0) {
qe = sq[qe].pre;
printf("(%d,%d) ", sq[qe].x, sq[qe].y);
}
printf("\n");
}
int search() {
int i,j,k;
qh = -1;
qe = 0;
maze[0][0] = -1; //表示已經訪問了
sq[0].pre = 0; //起始節點入隊
sq[0].x = 0;
sq[0].y = 0;
while (qh != qe) {
qh = qh + 1;
for (k = 0; k < 4; k = k + 1) { //尋找該點四個方向可通的點
i = sq[qh].x + fx[k]; //四個方向的x座標
j = sq[qh].y + fy[k]; //四個方向的y座標
if (check(i, j) == 1) { //判斷是否可通
qe = qe + 1;
sq[qe].x = i; //路可通,入隊
sq[qe].y = j;
sq[qe].pre = qh; //前一個點在隊列中的下標
maze[i][j] = -1; //該點訪問過,設置爲-1
if (sq[qe].x == 7 && sq[qe].y == 7) {
return 1; //有解返回1
}
}
}
}
return 0; //無解返回0
}
int main() {
if (search()) //判斷解
{
output(); //輸出結果
} else {
printf("No solution.\n");
}
}
3、相關文件:Github