迷宮問題。假設迷宮由m行n列構成,有乙個入口和乙個出口,入口座標為(1,1),出口座標為(m,n),試設計並驗證以下演算法:找出一條從入口通往出口的路徑,或報告乙個「無法通過」的資訊。
(1) 用c語言實現順序儲存結構上佇列的基本操作,然後利用該佇列的基本操作找出迷宮的一條最短路徑。
(2) 設計乙個二維陣列maze[m+2][n+2]表示迷宮,陣列元素為0表示該位置可以通過,陣列元素為1表示該位置不可以通行。maze[1][1]、maze[m][n]分別為迷宮的入口和出口。
(3) 輸入迷宮的大小m行和n列,動態生成二維陣列;由隨機數產生0或1,建立迷宮,注意m*n的迷宮需要進行擴充套件,擴充套件部分的元素設定為1,相當於在迷宮周圍布上一圈不准通過的牆。
(4) 要求輸出模擬迷宮的二維陣列;若存在最短路經,則由出口回溯到入口(出佇列並利用棧實現),再列印從入口到出口的這條路徑,例如(1,1),……,(i,j),……,(m,n);若沒有路徑,則列印「no path!」。
(5) 迷宮的任一位置(i,j)上均有八個可以移動的方向,用二維陣列direction存放八個方向上的位置偏移量。
direction[8][2]=,,,,,,,};
(6) 為避免出現原地踏步的情況為了標誌已經通過的位置,採用乙個標誌陣列mark[m+2][n+2],初值均為0,在尋找路徑的過程中,若通過了位置(i,j),則將mark[i][j]置為1。
(7) 為了記錄查詢過程中到達位置(i,j)及首次到達(i,j)的前一位置(i_pre,j_pre),需要記住前一位置(i_pre,j_pre)在佇列中的序號pre,即佇列中資料元素應該是乙個三元組(i,j,pre)。
(8) 搜尋過程簡單描述如下:將入口maze[1][1]作為第乙個出發點,依次在八個方向上搜尋可通行的位置,將可通行位置(i,j,pre)入隊,形成第一層新的出發點,然後依次出隊,即對第一層中各個位置分別搜尋它所在八個方向上的可通行位置,形成第二層新的出發點,…,如此進行下去,直至達到出口maze[m][n]或者迷宮所有位置都搜尋完畢為止。
#include
"stdio.h"
#include
"stdlib.h"
#include
"time.h"
typedef
struct nodenode;
typedef
struct queuequeue;
typedef
struct stackstack;
void
creatmaze
(int a[
100]
,int row,
int col)
}void
setmaze
(int a[
100]
,int row,
int col)
//設圍牆
void
paintmaze
(int a[
100]
,int row,
int col)
printf
("\n");
}}void
show_path
(queue q,
int x)
for(k=a.rear;k>a.front;k--)}
intfind_path
(int x1,
int y1,
int x2,
int y2,
int a[
100])if
(!a[q.n[q.front]
.i][q.n[q.front]
.j+1])
//是0if(
!a[q.n[q.front]
.i+1
][q.n[q.front]
.j+1])
if(!a[q.n[q.front]
.i+1
][q.n[q.front]
.j])if(
!a[q.n[q.front]
.i+1
][q.n[q.front]
.j-1])
if(!a[q.n[q.front]
.i][q.n[q.front]
.j-1])
if(!a[q.n[q.front]
.i-1
][q.n[q.front]
.j-1])
if(!a[q.n[q.front]
.i-1
][q.n[q.front]
.j])if(
!a[q.n[q.front]
.i-1
][q.n[q.front]
.j+1])
}return0;
}int
main()
;int row,col;
printf
("請輸入行列\n");
scanf
("%d%d"
,&row,
&col)
;setmaze
(maze,row+
2,col+2)
;paintmaze
(maze,row+
2,col+2)
;int k=
find_path(1
,1,row,col,maze);if
(k)printf
("ok");
else
printf
("no path!\n");
return0;
}
棧和佇列(二) 棧的應用舉例
一 數制轉換 十進位制數n和其它d進製數的轉換是計算機實現計算的基本問題,其解決方法很多,其中乙個簡單的演算法是基於下列原理 n n div d d n mod d。其中 div為整除運算,mod為求餘運算。例 1348 10 2504 8,其運算過程如下 n n div 8 n mod 8 134...
C 鏈式佇列的綜合應用
先定義佇列的幾個基本操作,再設計一主函式利用佇列的操作完成以下功能 鍵盤輸入的字元可以臨時存入鍵盤的緩衝區中。為了充分利用緩衝區的空間,往往將緩衝區設計成鏈式迴圈佇列的結構,並為迴圈佇列結構的緩衝區設定乙個隊首指標和乙個隊尾指標。每輸入乙個字元到緩衝區中,就將尾指標後移,鏈入緩衝區的迴圈佇列之中 每...
棧和佇列的應用 魔王語言
一 基本要求 用下述三條具體規則 實現。設大寫字母表示魔王語言的詞彙 小寫字母表示人的語言詞彙 希臘字母表示可以用大寫字母或小寫字母代換的變數。魔王語言可含人的詞彙。1 a sae a的規則可以自己定義,比如a abc 2 b tada b的規則也可以自己定義哈 3 1 2.n n n 1.1 二 ...