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