DFS 遞迴 迷宮

2021-07-29 22:47:01 字數 1777 閱讀 2874

這幾天都在看那本演算法書【啊哈!演算法】...

今天看到深度優先搜尋(dfs),總結了自己看得懂的使用模板...

dfs的模板..

public class main

static void dfs()else

} }}

1:主方法呼叫靜態方法dfs。

2:dfs方法的步驟 1:先判斷目前是否滿足條件。

2:滿足的話,就執行輸出結果的**(或者計數加1)。

3:不滿足,就執行else,先交換。

4:再一次dfs。

5:最後記得要把交換復原。

dfs的具體解決方案是在這個模板上添枝加葉的,舉個例子(走迷宮)。

從淺藍色格仔為起點,到深藍色終點的迷宮(原諒我的強迫症對稱...)

先寫主方法的**

public static void main(string args),,,

,,

};

p=4;

q=4;

n=a[0].length;

m=a.length;

book =new int[n][m];

startx =0;

starty =0;

book[startx][startx]=1;

dfs(a,startx,starty,0);

system.out.print(min);

}

其中,p,q為目的地的x,y值。 nm為邊界。 book二維陣列用來標記格仔已經走過。startx,starty為起始位置xy值。

dfs:

static void dfs(int a,int x,int y,int step),,,

};int tx,ty,k;

if(x == p && y==q )

}} }

next代表每次都走一步,順序是先右,再下,再左,再上。

判斷目前x,y是否等於 p,q(目的地),是的話,就看步數是否比上乙個方法少,是的話就賦值。

若是還沒到目的地,則開始走下一步。

tx是下一步的x值,ty是下一步的y值。

判斷是否出界,或是走到牆(格仔位置的值為1)的地方,是的話continue(即tx,ty這個值不行,走另乙個方向)

若滿足條件,判斷這一步是否已經走過,沒有走過的話,就把要走的那個格仔的值置1,遞迴dfs()。tx變成x,ty變成y,step加1。

最後記得要恢復原狀。

整個**:

public class main,,,

,,};

p=4;

q=4;

n=a[0].length;

m=a.length;

book =new int[n][m];

startx =0;

starty =0;

book[startx][startx]=1;

dfs(a,startx,starty,0);

system.out.print(min);

} static void dfs(int a,int x,int y,int step),,,

};int tx,ty,k;

if(x == p && y==q )

}} }

}

迷宮問題dfs

迷宮問題 棧作為深度優先遍歷 dfs 採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋 可以最快的找到解 include define m 8 define n 8 define maxsize 1000 typedef struct box typedef struct sttype 迷宮問題常用...

A 逃離迷宮 DFS

給定乙個m n m行,n列 的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中有些地方是空地,gloria可以穿越,有些地方是障礙,她必須繞行,從迷宮的乙個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,gloria不能走到迷宮外面去。令人頭痛的是,glori...

迷宮 dfs經典

1792 迷宮 總時間限制 3000ms 記憶體限制 65536kb 描述一天extense在森林裡探險的時候不小心走入了乙個迷宮,迷宮可以看成是由n n的格點組成,每個格點只有2種狀態,和 前者表示可以通行後者表示不能通行。同時當extense處在某個格點時,他只能移動到東南西北 或者說上下左右 ...