您好,登錄后才能下訂單哦!
本文實(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ì)有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。