(1)從圖中某個初始頂點v出發,首先訪問初始頂點v。
(2)然後依次從v的未被訪問的鄰接點w,再從w出發進行深度優先遍歷,直到圖中所有與v有路徑相通的的頂點都被訪問過為止。
解決問題:
(1)如何確定乙個頂點是否訪問過?
設定乙個visited全域性陣列,
visited[i]=0表示頂點i沒有訪問;
visited[i]=1表示頂點i已經訪問過。
(在圖中也可以修改圖本身來實現)
void
dfs(
int s)
嘗試每一種可能 }
}
(1)問題描述:
在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。
(2)輸入:
輸入含有多組測試資料。
每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將在乙個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
當為-1 -1時表示輸入結束。
隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。
(3)輸出:
對於每一組資料,給出一行輸出,輸出擺放的方案數目c (資料保證c<2^31)。
(4)樣例輸入:
2 1(5)樣例輸出#..#
4 4…#
…#..#…
#…-1 -1
21
#include
#include
int n,k;
char map[10]
[10];
int sum;
int visited[10]
;void
dfs(
int y,
int t)
//滿足條件,次數加1,返回;
if(y<=n)
dfs(y+
1,t)
;//一直呼叫到最後一行,從最後一行開始,
//考慮到每一種情況;
for(
int i=
1;i<=n;i++)}
}int
main()
return0;
}
//用dfs來計算最短路徑
#include
int r,c,num=
10000
;char map[41]
[41];
int dx=
;int dy=
;void
dfs(
int x,
int y,
int k)
}for
(int i=
0;i<
4;i++)}
}int
main()
} map[1]
[1]=
'#';
dfs(1,
1,1)
;printf
("%d"
,num)
;}
//dfs遍歷是否能夠從(ha,la)到(hb,lb)
#include
#include
int dx=
;int dy=
;int n,ha,la,hb,lb,nx,ny;
bool flag;
char map[
200]
[200];
void
dfs(
int x,
int y)
else
dfs(nx,ny);}
}}intmain()
scanf
("%d%d%d%d"
,&ha,
&la,
&hb,
&lb);if
(map[ha]
[la]
=='#'
||map[hb]
[lb]
=='#'
)elseif(
!flag)
printf
("no\n");
}return0;
}
//棋盤問題**
#include
#include
int n,k;
char map[10]
[10];
int sum;
int visited[10]
;void
dfs(
int y,
int t)
if(y<=n)
dfs(y+
1,t)
;for
(int i=
1;i<=n;i++)}
}int
main()
return0;
}
深度優先搜尋DFS
作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...
深度優先搜尋 DFS
深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...
深度優先搜尋(dfs)
深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...