一般步驟
(1) 把初始狀態放入陣列中,設為當前狀態;
(2) 擴充套件當前的狀態,產生乙個新的狀態放入陣列中,同時把新產生的狀態設為當前狀態;
(3) 判斷當前狀態是否和前面的重複,如果重複則回到上乙個狀態,產生它的另一狀態;
(4) 判斷當前狀態是否為目標狀態,如果是目標,則找到乙個解答,結束演算法。
(5) 如果陣列為空,說明無解。
//層數固定的情況
void
dfs(
int k)
else}}
}
經典問題
描述給定整數a1、
a2、.
....
..an
a_、a_、.......a_
a1、a2
、..
....
.an
,判斷是否可以從中選出若干數,使它們的和恰好為k。
輸入首先,n
nn和k
kk,n
nn表示數的個數,k
kk表示數的和。 接著一行n
nn個數。
(1
<=n
<=20
1<=n<=20
1<=n
<=2
0,保證不超int
intin
t範圍)
輸出如果和恰好可以為k
kk,輸出「yes」,否則「no」
樣例輸入
4 13
1 2 4 7
樣例輸出
yes
#include
#define maxn 10005
int a[maxn]
, n, k;
bool dfs
(int k,
int sum)
intmain()
求全排列void
swap
(int
&a,int
&b)void
perm
(int list,
int low,
int high)
else
}}
類似於樹的按層次遍歷的過程,一般用來求最短路徑最小操作等等
一般步驟
void
bfs(起始點)
for(遍歷所有x相鄰點)}}
隊列為空,廣搜結束;
}
描述
給定乙個n∗m
n*mn∗
m的迷宮,每一步可以向上下左右四個方向走動,求出從起點到終點所需的最小步數
(』#』,』.』,『s』,'g』分別表示牆壁,通道,起點和終點)
樣例輸入
#s######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...g#
樣例輸出
22
#include
#include
#include
using namespace std;
const
int inf =
100000
;const
int max =
101;
typedef pair<
int,
int>
p;char map[max]
[max]
;int d[max]
[max]
;//表示起點到各個位置的最短距離
int sx, sy, gx, gy;
//表示起點和終點座標
int n, m;
int dx[4]
=;int dy[4]
=;bool check
(int x,
int y)
intbfs()
}}return d[gx]
[gy];}
intmain()
if(map[i]
[j]==
'g')}}
int res =
bfs();
cout<< res
}
簡單搜尋 DFS BFS
簡單搜尋 dfs bfs dfs 俗稱爆搜,為深度優先搜尋 bfs 俗稱廣搜,為寬度優先搜尋 假設當前有一棵解答樹 當然一般非標準樹形 dfs借助棧一路下通,直通到最後一層 即已算出乙個可行解 再退一層,看看在這一層還有沒有其他分支,有就繼續扎下去 重複這個過程 so,這就是所謂的 dfs可以解任何...
簡單搜尋 DFS BFS
1 dfs depth first search 深度優先搜尋演算法 是圖與樹搜尋中用到的一種演算法 遍歷的思想是 先從根部進行,一直遍歷到最底部的葉節點,然後再返回到根節點,判斷,如果該根節點上的葉節點都被遍歷過,再返回到根節點,直到遍歷到整棵樹。dfs遍歷循序 我們可以通過棧的思想來進行搜尋,a...
最簡單的搜尋演算法
目前自己用的比較多的是廣搜bfs 以下是別的大神們的詳細講解 原 bfs可用於解決2類問題 從a出發是否存在到達b的路徑 從a出發到達b的最短路徑 這個應該叫最少步驟合理 其思路為從圖上乙個節點出發,訪問先訪問其直接相連的子節點,若子節點不符合,再問其子節點的子節點,按級別順序依次訪問,直到訪問到目...