問題描述:
有如圖8×8的迷宮
o******x
ooooo***
xoxxooox
xoxxoxxo
xo******
xooooxoo
******xo
其中,o表示通路方塊,x表示障礙方塊。
假設入口位置為(0,0)出口為右下角方塊位置(7,7)設計乙個程式求指定入口到出口的一條迷宮路徑。
分析
用n表示迷宮大小,用二維陣列maze存放迷宮,從(x,y)方塊可以試探上、下、左、右4個方位。假設總是按從方位0到方位3的順序試探,各方位對應的水平方向偏移量h[4]=、垂直偏移量v[4]=
從(x,y)出發(初始為入口)搜尋目標(出口)。對於當前方塊(x,y),需要試探4個相鄰的方塊將對應的迷宮值由『o』改為『 』(空格字元),當回過來時將其迷宮值恢復為『o』。
**1:
#include
#define maxn 10
int n=8;
char maze[maxn]
[maxn]=,
, ,, ,
, , ,
};int h[4]
=; //水平偏移量,下標對應方位號1~3
int v[4]
=; //垂直偏移量
一定是最短路徑
從(x,y)出發(初始為入口)搜尋目標(出口)。由於在stl中queue不能順序遍歷,這裡用乙個陣列作為非迴圈佇列,front和rear分別為對頭和隊尾(初始值均設定為-1),每個進隊元素有唯一下標
struct position
;
定義佇列:
position qu[maxq]
;int front=-1,rear=-1;
首先,將根入口方塊(其pre置為-1)進隊,佇列不空時迴圈:出隊方塊p1作為當前方塊(在佇列陣列中的下標為front),若p1為出口,通過佇列陣列qu反向退出迷宮路徑並輸出;
否則查詢p1的每乙個相鄰方塊p2,若p2位置有效(即p2.x>=0&&p2.y>=0&&p2.x**2:
#include
#define maxq 100
#define maxn 10
int n=8;
char maze[maxn]
[maxn]=,
, ,, ,
, , ,
};int h[4]
=; //水平偏移量,下標對應方位號1~3
int v[4]
=; //垂直偏移量
struct position //佇列元素型別
;position qu[maxq]
; //定義佇列qu
int front=-1,rear=-1; //對頭和隊尾
void disp(int front)
for(i=0;i
) //輸出迷宮路徑 }
蠻力法求解「獄吏問題」
問題描述 獄吏問題 某國王對囚犯進行大赦,讓一獄吏n次通過一排鎖著的n間牢房,每通過一次按所定規則轉動n間牢房中的某些門鎖,每轉動一次原來鎖著的被開啟,原來開啟的被 鎖上通過n次後,門鎖開著的,牢房中的犯人被放出,否則,犯人不得釋放。轉動門鎖的規則是這樣的,第一次通過牢房,從第一間開始轉動每一把鎖,...
蠻力法求解冪集問題
對於給定的正整數n n 1 求1到n構成的集合的冪集 包括全集和空集 思路將二進位制位與冪集對應起來,n的冪集個數為2 n2 n 2n,每乙個二進位制位代表乙個元素。下面以n等於3為例。集合元素 對應的二進位制位 對應的十進位制數 000 0011 0102 0113 1004 1015 1106 ...
回溯法求解迷宮問題
題目 這是我在老師發的ppt上發現的一道題,如下 1表示起點 7表示終點,一共六個路口,每個路口可以通達最多左上右三個路口,不能走的方向用0表示,求從1到7的路徑。求解思路 每個路口最多有三個搜尋分支。把演算法設計為如下的搜尋過程 把整個搜尋分解為向左 向前和向右三個方向上子問題的搜尋。當搜尋到某個...