POJ1321 棋盤問題

2021-10-10 18:01:04 字數 875 閱讀 8545

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

輸入含有多組測試資料。 

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

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

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

2 1

#..#

4 4...#

..#.

.#..

#...

-1 -1 輸入 輸出 2 1

意思是#上面能放棋子,然後呢給出棋盤大小n與可放棋子數k.

然後以行數step作為遞迴層數 下面先放個**

#include#include#includeusing namespace std;

char map[10][10];int vis[10];int tot=0,n,k;

void dfs(int step,int amount)

for(i=step;i重點是dfs裡面的那個二重迴圈,只用一重是不行的,因為當第一次搜完(遞迴到n+1)層的時候,回去第一行搜第二列的點,然後進去下一層的時候,又重複訪問來了二行1列的數字.

用二重迴圈是什麼思路呢..以第一行為例子,從第一行出發,搜尋完所有棋子在第一行的情況,然後不再使用第一行,去使用第二行第三行,以此類推,直到不能放為止,然後這裡我貌似發現了乙個剪枝

如果可放棋子數大於當前列數,就不可能有滿足答案的條件,就能return了,不過不剪也能過?.不管了不管了

POJ 1321 棋盤問題

time limit 1000ms memory limit 10000k total submissions 7007 accepted 3390 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列...

poj 1321 棋盤問題

棋盤問題 time limit 1000ms memory limit 10000k total submissions 15365 accepted 7600 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一...

POJ 1321 棋盤問題

找到第乙個有 的行開始回溯就可以了 include include using namespace std const int maxn 9 char board maxn maxn bool c maxn int ans,n,k void backtracking int curi,int cnt...