C語(yǔ)言使用廣度優(yōu)先搜索算法解決迷宮問(wèn)題(隊(duì)列)
本文實(shí)例講述了C語(yǔ)言使用廣度優(yōu)先搜索算法解決迷宮問(wèn)題。分享給大家供大家參考,具體如下:
變量 head 和 tail 是隊(duì)頭和隊(duì)尾指針, head 總是指向隊(duì)頭, tail 總是指向隊(duì)尾的下一個(gè)元素。每個(gè)點(diǎn)的 predecessor 成員也是一個(gè)指針,指向它的前趨在 queue 數(shù)組中的位置。如下圖所示:

廣度優(yōu)先是一種步步為營(yíng)的策略,每次都從各個(gè)方向探索一步,將前線推進(jìn)一步,圖中的虛線就表示這個(gè)前線,隊(duì)列中的元素總是由前線的點(diǎn)組成的,可見正是隊(duì)列先進(jìn)先出的性質(zhì)使這個(gè)算法具有了廣度優(yōu)先的特點(diǎn)。廣度優(yōu)先搜索還有一個(gè)特點(diǎn)是可以找到從起點(diǎn)到終點(diǎn)的最短路徑,而深度優(yōu)先搜索找到的不一定是最短路徑。
#include <stdio.h>
#define MAX_ROW 5
#define MAX_COL 5
struct point { int row, col, predecessor; } queue[512];
int head = 0, tail = 0;
void enqueue(struct point p)
{
queue[tail++] = p;
}
struct point dequeue(void)
{
return queue[head++];
}
int is_empty(void)
{
return head == tail;
}
int maze[MAX_ROW][MAX_COL] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
void print_maze(void)
{
int i, j;
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++)
printf("%d ", maze[i][j]);
putchar('\n');
}
printf("*********\n");
}
void visit(int row, int col)
{
struct point visit_point = { row, col, head-1 };
maze[row][col] = 2;
enqueue(visit_point);
}
int main(void)
{
struct point p = { 0, 0, -1 };
maze[p.row][p.col] = 2;
enqueue(p);
while (!is_empty()) {
p = dequeue();
if (p.row == MAX_ROW - 1 /* goal */
&& p.col == MAX_COL - 1)
break;
if (p.col+1 < MAX_COL /* right */
&& maze[p.row][p.col+1] == 0)
visit(p.row, p.col+1);
if (p.row+1 < MAX_ROW /* down */
&& maze[p.row+1][p.col] == 0)
visit(p.row+1, p.col);
if (p.col-1 >= 0 /* left */
&& maze[p.row][p.col-1] == 0)
visit(p.row, p.col-1);
if (p.row-1 >= 0 /* up */
&& maze[p.row-1][p.col] == 0)
visit(p.row-1, p.col);
print_maze();
}
if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1)
{
printf("(%d, %d)\n", p.row, p.col);
while (p.predecessor != -1) {
p = queue[p.predecessor];
printf("(%d, %d)\n", p.row, p.col);
}
} else
printf("No path!\n");
return 0;
}
運(yùn)行結(jié)果如下:
[root@localhost arithmetic]# ./maze2.out 2 1 0 0 0 2 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 ********* 2 1 0 0 0 2 1 0 1 0 2 0 0 0 0 0 1 1 1 0 0 0 0 1 0 ********* 2 1 0 0 0 2 1 0 1 0 2 2 0 0 0 2 1 1 1 0 0 0 0 1 0 ********* 2 1 0 0 0 2 1 0 1 0 2 2 2 0 0 2 1 1 1 0 0 0 0 1 0 ********* 2 1 0 0 0 2 1 0 1 0 2 2 2 0 0 2 1 1 1 0 2 0 0 1 0 ********* 2 1 0 0 0 2 1 2 1 0 2 2 2 2 0 2 1 1 1 0 2 0 0 1 0 ********* 2 1 0 0 0 2 1 2 1 0 2 2 2 2 0 2 1 1 1 0 2 2 0 1 0 ********* 2 1 0 0 0 2 1 2 1 0 2 2 2 2 2 2 1 1 1 0 2 2 0 1 0 ********* 2 1 2 0 0 2 1 2 1 0 2 2 2 2 2 2 1 1 1 0 2 2 0 1 0 ********* 2 1 2 0 0 2 1 2 1 0 2 2 2 2 2 2 1 1 1 0 2 2 2 1 0 ********* 2 1 2 0 0 2 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 1 0 ********* 2 1 2 2 0 2 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 1 0 ********* 2 1 2 2 0 2 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 1 0 ********* 2 1 2 2 0 2 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 1 2 ********* 2 1 2 2 2 2 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 1 2 ********* 2 1 2 2 2 2 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 1 2 ********* (4, 4) (3, 4) (2, 4) (2, 3) (2, 2) (2, 1) (2, 0) (1, 0) (0, 0)
希望本文所述對(duì)大家C語(yǔ)言程序設(shè)計(jì)有所幫助。
- C語(yǔ)言實(shí)現(xiàn)走迷宮
- C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之迷宮求解問(wèn)題
- C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之迷宮問(wèn)題
- C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)迷宮實(shí)驗(yàn)
- 基于C語(yǔ)言實(shí)現(xiàn)的迷宮算法示例
- C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題(堆棧)
- C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)中求解迷宮問(wèn)題實(shí)現(xiàn)方法
- 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的走迷宮游戲
- 基于C語(yǔ)言實(shí)現(xiàn)的迷宮游戲代碼
- C語(yǔ)言通過(guò)棧實(shí)現(xiàn)小人走迷宮
相關(guān)文章
Visual?Studio?2022?配置?PCL?1.12.1?的問(wèn)題小結(jié)
這篇文章主要介紹了Visual?Studio?2022?配置?PCL?1.12.1?的經(jīng)驗(yàn)總結(jié)分享,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
C語(yǔ)言實(shí)現(xiàn)三子棋游戲簡(jiǎn)易版
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋游戲簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Windows 環(huán)境下使用 Qt 連接 MySQL
這篇文章主要介紹了Windows 環(huán)境下使用 Qt 連接 MySQL的相關(guān)資料,需要的朋友可以參考下2017-07-07
C語(yǔ)言結(jié)構(gòu)體字節(jié)對(duì)齊的實(shí)現(xiàn)深入分析
這篇文章主要介紹了C語(yǔ)言結(jié)構(gòu)體字節(jié)對(duì)齊的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-10-10
C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法
今天小編就為大家分享一篇C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

