棧和佇列的綜合應用

2021-10-01 15:45:49 字數 2728 閱讀 5832

迷宮問題。假設迷宮由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 二 ...