dfs處理的問題

2022-06-27 16:18:11 字數 2199 閱讀 8060

搜尋 有狀態約束的 問題

poj-1321

在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。

input

輸入含有多組測試資料。

每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將在乙個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n

當為-1 -1時表示輸入結束。

隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。

output

對於每一組資料,給出一行輸出,輸出擺放的方案數目c (資料保證c<2^31)。

1 #include2 #include3 #include

4 #include

5 #include6

using

namespace

std;

7#define maxn 1000

8char a[10][10];9

int vis[10

];10

intn,k,m;

11long

long cnt=0;12

void dfs(int x)//

按行遍歷

1319

if(x>=n)

20return;21

for(int i=0;i)

2231

}32 dfs(x+1

);33}34

intmain()

3547 }

方法二:-----超時dfs思想

1 #include2 #include3 #include

4 #include

5 #include6

using

namespace

std;

7int n,k,cnt=0

,m;8

char a[10][10];9

int vis[10

];10

void dfs(int

x)11

17if(x>=n)

18return;19

for(int j=x;j)

20for(int i=0;i)

2130}31

}32intmain()

3345 }

二:連通性問題:

1.判斷連通塊數量問題

3 3

1 1 1

0 1 0

1 0

3

分析:如圖三個連通塊表示分別用三個顏色表示

1 1 1

0 1 0

1 0 1

小結:感覺dfs寫之前需要清楚知道dfs結束遍歷條件,遍歷是如何遍歷的(比如:地圖就是四個方向,該題也是四個方向,有些是樹圖就是for迴圈遍歷)

兩個for迴圈遍歷每一塊區域的某乙個點 ,然後用dfs對該塊區域所有點進行標記

1 #include2 #include

3 #include4 #include

5using

namespace

std;

6int

n,m;

7int a[105][105];8

int vis[105][105];9

int cnt=0;10

int turn[4][2]=,,,};

11void dfs(int x,int

y)1225}

26}27int

main()

2845

}46 cout47 }

注意:這裡很容易犯乙個錯誤,就是把陣列a的下標定為0開始,這是個false!!!!!!

原因:我們走四個方向是對該點座標的x,y進行加一減一操作而進行,但是如果你下標是0,減一就是在下標越界!!!

解決:下標起始定為1

三.n皇后問題:

打表加dfs

迷宮問題dfs

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

組合問題(DFS)

給定兩個整數 n 和 k,返回 1 n 中所有可能的 k 個數的組合。輸入 n 4,k 2 輸出 2,4 3,4 2,3 1,2 1,3 1,4 1 題目要求求子集合 所以子集合中的順序沒有要求 2 注意生成子集合時 path陣列下標的確定 這裡沒有使用正常的 idx 作為下標進行確認 因為 idx...

島嶼問題(DFS)

題目 方格搜尋類題目均可使用dfs演算法 695.給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,...