什麼資料讀入,預處理什麼的不說了,主要看過程dfs。program ex11;
const dx:array[1..4]of -1..1=(0,1,0,-1);
dy:array[1..4]of -1..1=(1,0,-1,0);
var i,j,n:longint;
a:array[0..21,0..21]of char;
procedure
dfs(x,y:longint);
var tx,ty,i:longint;
begin
a[x,y]:='#';
if(x=n)and(y=n)then
begin writeln('yes');halt;end;
for i:=1to4
dobegin
tx:=x+dx[i];ty:=y+dy[i];
if a[tx,ty]='.'
then dfs(tx,ty);
a[x,y]:='.'
end;
end;
begin
readln(n);
fillchar(a,sizeof(a),'#');
for i:=1
to n do
begin
for j:=1
to n do
read(a[i,j]);
readln;
end;
dfs(1,1);
writeln('no');
end.
先將當前這一步走到的設定成「牆」,防止由這一步走出的下一步走了回頭路
如果已經到達終點,就輸出yes,然後直接退出程式a
[x,y]
:='#';
窮舉四個方向(沒有到終點才會執行)if(x=n)and(y=n)then
begin writeln('yes');halt;end;
計算出走第i個方向時下一步的座標,記為(tx,ty)for i:=1to4
do
tx:=x+dx[i];ty:=y+dy[i];
如果下一步是「路」,則走向下一步
如果事實證明這種走法無法到達終點,那麼將當前的座標從「牆」還原為「路」if a[tx,ty]='.'
then dfs(tx,ty);
a[x,y]:='.'
由於錯誤的走法最終一定會導致在某一步後沒有下一步可走,所以還原a[x,y]在擴充套件下一步的**後面加上即可。
而主程式中的dfs(1,1)
則是從起點(1,1)開始搜尋。
深搜原理:一條道走到黑,不撞南牆不回頭(數字為訪問順序)
最後總結一下深搜框架:
procedure
dfs()
;begin
ifthen
for i:=1
todo
begin
ifthen
begin
dfs()
end;
end;
end;
廣搜與深搜演算法
bfs 廣度優先搜尋 從起點開始,檢視與其相鄰並且滿足題中條件的周圍的所有點 第一層點 然後再以他們為 起點 再去檢視與他們相鄰的第二層的點,一層一層的遍歷,直到找到目標。廣搜一般用於尋找最小路徑等型別題目,因為是層層尋找,所以尋找到的目標一定是最好的解,其大概過程如同一滴水滴到水池產生的水波。但是...
深搜演算法筆記
沒錯高產的我又來了 1.初始狀態,從頂點1開始 2.依次訪問過頂點1,2,3後,終止於頂點3 3.從頂點3回溯到頂點2,繼續訪問頂點5,並且終止於頂點5 4.從頂點5回溯到頂點2,並且終止於頂點2 5.從頂點2回溯到頂點1,並終止於頂點1 6.從頂點4開始訪問,並終止於頂點4 所謂深搜 也叫回溯法 ...
DFS 深搜 演算法解析
圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點 v 表示,而物件之間的關係或者關聯則通過圖的邊 e 來表示。圖可以分為有向圖和無向圖,一般用g v,e 來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。在圖的基本演算法中,最初需要接觸的就是圖的遍歷演算法,根據訪問節點...