這幾天都在看那本演算法書【啊哈!演算法】...
今天看到深度優先搜尋(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處在某個格點時,他只能移動到東南西北 或者說上下左右 ...