搜尋 有狀態約束的 問題
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 #include4 #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 #include4 #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 31 1 1
0 1 0
1 0
3
分析:如圖三個連通塊表示分別用三個顏色表示
1 1 1小結:感覺dfs寫之前需要清楚知道dfs結束遍歷條件,遍歷是如何遍歷的(比如:地圖就是四個方向,該題也是四個方向,有些是樹圖就是for迴圈遍歷)0 1 0
1 0 1
兩個for迴圈遍歷每一塊區域的某乙個點 ,然後用dfs對該塊區域所有點進行標記
1 #include2 #include3 #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,...