c解決迷宮問題

2021-06-21 03:13:11 字數 2331 閱讀 6935

問題描述:

在迷宮中求從入口到出口的一條簡單路徑。迷宮可用方塊來表示, 每個方塊或者是通道(用空白方塊表示)或者是牆(用帶陰影的方塊表示)。 「迷宮求解」這個經典的問題,應用棧這種資料結構,自己設計乙個方案, 並上機實現從入口到出口的一條簡單路徑。為了表示迷宮,用二維陣列表示,如

int a[10][8]=,,,

,,,,

,,};

3是入口,4是出口。

參照網上一般思路:

在求解時

,通常用的是

「窮舉求解

」的方法

,即從入口出發

,順某一方向向前試探,

若能走通

,則繼續往前走;否則沿原路退回

,換乙個方向再繼續試探

,直至所有可能的通路都試探完為止。為了保證在任何位置上都能

沿原路退回

(稱為回溯

),需要用乙個

後進先出的棧

來儲存從入口到當前位置的路徑。

我的理解:

用棧儲存走過的路線,每個節點的資料又設為元素節點,包含橫縱座標資訊,還有到達下一步的方向資訊。如下所示

typedef structnode;

為了方便計算下一步的方向,用1,2,3,4

表示左上右下,這樣用變數自增就可得到下一步的方向。

node step[4]= ,,,};//往左上右下的基座標

具體思路:

其實這就是乙個深度優先遍歷的思想。

1.s走到a,即s入棧,並把如何到a的方式記錄下來。當前位置設為a,下一步未知設為b。怎麼到達b?

2.從a的左上右下四個方向開始試探。

if(找到乙個方向可以走通且這個方向之前沒有被試探過,就可以從這個方向進入b)

a入棧,並把這個方向存到a中,把b設為已訪問。

else (如果找遍四個方向都行不通)

那麼就把當前位置a回退到上一步s,並把a還原為未訪問。由於s中儲存了到a的方向,只要從到a的方向的下乙個方向開始繼續試探,得出怎麼到a,再從這個a開始到b.進入2.知道達到出口程式結束迴圈。

具體**如下:

#include "stdio.h"

#include "stdlib.h"

#define maxsize 200

#define lines 10 // 定義行數

#define cols 8 // 定義列數

typedef structnode;

typedef structseqstack,*pseqstack;

pseqstack init_seqstack()//初始化棧

return s;

}int empty_seqstack(pseqstack s)//判棧空

int push(pseqstack s, int x, int y,int a)//入棧

} int pop(pseqstack s, int *x, int *y, int *a)//出棧

} void destroy_seqstack (pseqstack * seqstackpoint)

if (*seqstackpoint) free (*seqstackpoint) ;

*seqstackpoint =null;

return ;

}void visit(pseqstack p)

}int maze(int a[lines][cols])

,,,};//往左上右下的基座標

pseqstack s;

s=init_seqstack();

for(i = 0; i < lines; i++)//獲取入口座標

for(j = 0; j < cols; j++)

} push(s,x,y,-1);//入口進棧 ,並將方向設為-1,表示不知道下一步的方向是多少,具體值需要下面確定,然後再放入棧中。

a[x][y] = -1;//訪問入口 ,-1表示當前位置已經訪問。1表示牆壁,0表示可行,3是入口,4是出口。

while(!empty_seqstack(s) )

if((a[xs][ys] == 0) ||(a[xs][ys] == 4)) find = 1;

} if(find == 1)//找到了下乙個可走位置, a到b可走

} else //當前位置的下一步不可通過(當前位置為牆壁或者已經訪問過)

}

if(empty_seqstack(s) )

} void main()

, ,,,

,,,,

,};

maze(a);

}

C 解決迷宮問題

include include define m 11 define n 10 預設迷宮結構 char maze array m n 記錄迷宮結點的路過次數 int maze node passby array m n 輸出當前的迷宮局勢 void print maze 輸出記錄路徑結點出現次數的陣...

c 解決迷宮問題

一 實驗內容 1.1 知識點 1.2 實驗環境 2.1 地圖 利用二維陣列定義乙個高 20 長 30 的地圖,同時用特殊 標記地圖的每乙個位置。比如通路設定為 0,死路設定為 1 等,在顯示地圖的時候只需要根據標記列印出地圖每個位置對應的符號。比如 0 為通路,用 兩個空格表示 1 為死路,用 方塊...

迷宮問題 遞迴解決

建立人 wdl 建立時間 2021 3 21 描述 public class migong 左右全部置為1 for int i 0 i 8 i 設定擋板,1表示 map 3 1 1 map 3 2 1 map 1 2 1 map 2 2 1 輸出地圖 system.out.println 地圖的情況...