從程式到演算法 深搜

2021-08-13 02:41:16 字數 1790 閱讀 7429

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.

什麼資料讀入,預處理什麼的不說了,主要看過程dfs。

先將當前這一步走到的設定成「牆」,防止由這一步走出的下一步走了回頭路

a

[x,y]

:='#';

如果已經到達終點,就輸出yes,然後直接退出程式

if(x=n)and(y=n)then

begin writeln('yes');halt;end;

窮舉四個方向(沒有到終點才會執行)

for i:=1to4

do

計算出走第i個方向時下一步的座標,記為(tx,ty)

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 來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。在圖的基本演算法中,最初需要接觸的就是圖的遍歷演算法,根據訪問節點...