Poj 1321 棋盤問題 回溯 類N皇后

2021-09-07 11:24:26 字數 1548 閱讀 3407

棋盤問題

time limit:1000ms

memory limit:10000k

total submissions:27749

accepted:13710

description

在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有差別。要求擺放時隨意的兩個棋子不能放在棋盤中的同一行或者同一列。請程式設計求解對於給定形狀和大小的棋盤,擺放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皇后的變式好好學習一下,類n皇后真是學習回溯非常好的例題。

分析:

如在第i行第j列,遇到'#'號。那麼接下來的處理就有兩種情況了。

第一種:把i,j放入到乙個陣列c中,然後繼續向第i+1行進行搜尋,直到找到k個位置或者到了棋盤的邊界

另外一種:我不選擇第i行第j列的位置,然後繼續向第i+1行進行搜尋,直到找到k個位置或者到了棋盤的邊界

最後。回溯另乙個很重要的就是剪枝,剪枝過程在**裡面有凝視。

#include #include #include #include #include #include #include using namespace std;

const int maxn = 15;

int n,k,ans,c[maxn];

char map[maxn][maxn];

bool can_place(int row,int col)

return true;

}void dfs(int row,int cur)

if(row >= n) return;

if(cur + (n-row) < k) return; // 剪枝

for(int j = 0;j < n;j++)

}dfs(row+1,cur);

}int main()

}dfs(1,0);

printf("%d\n",ans);

}return 0;

}

POJ1321 棋盤問題 回溯法

在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。input 輸入含有多組測試資料。每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將...

POJ 1321 棋盤問題 DFS 回溯

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

POJ1321 棋盤問題 DFS回溯

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