kuangbin專題一簡單搜尋 棋盤問題

2021-10-08 13:52:17 字數 1044 閱讀 9078

原題如下:

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

input 輸入含有多組測試資料。 每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將在乙個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n 當為-1

-1時表示輸入結束。 隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。 output 對於每一組資料,給出一行輸出,輸出擺放的方案數目c

(資料保證c<2^31)。

sample input

2 1#.

.#4 4

…#. .#.

.#. .

#…-1 -1

sample output

2 1這是搜尋問題。作為乙個小白,先考慮深搜能不能解決。

可以。問題轉換一下,從始至終只有乙個棋子,只能在n*n的矩陣棋盤中下k步,保證其每一步在棋盤區域且不與之前的位置重複或在同行同列。求所有可行的擺放方案數c

這就是典型的深搜。

關鍵點:

如何避免重複或同行同列有棋子->用陣列記錄列的狀態,棋子每下一步行數增加

以下是ac**

//#include//vj上不能用

#include#include#include#include#includeusing namespace std;

int x,num,k,n,b[10],sum;

char a[10][10];

void dfs(int x,int num)//x為行 num為步數

if(x>n) return;

for(int i=1;i<=n;i++) }

dfs(x+1,num); }

int main()

return 0;

}

kuangbin專題一 簡單搜尋

poj 1426 找出乙個由1和0組成的十進位制數m滿足m為n的倍數。有兩種做法,一種是bfs從低位數往高位數搜,另一種是用二叉樹陣列的結構存每次的求出來的餘數,當餘數為0時返回下標,然後根據下標求出其對應的數。1.bfs include includeusing namespace std con...

kuangbin專題一簡單搜尋總結

e find the multiple 題意 找乙個能整除n的數m,對m的要求是只有0和1組成。n不超過200,m長度不超過100.思路 很多人都寫了乙個假演算法,就是在unsigned long long 的範圍裡面找就行了,雖然也a了,但博主想在這裡提一下正確的思路。首先用到了同餘定理 即以任意...

kuangbin專題一 簡單搜尋 (完整)

1.poj 1321 棋盤排列 類似八皇后 poj 1321 棋盤排列 類似八皇后的排列搜尋。include include include using namespace std typedef long long ll int dp 11 11 char mp 11 11 int col 11 ...