原題目:
棋盤問題
time limit:1000ms
memory limit:10000k
total submissions:62732
accepted:30027
description
在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。
input
輸入含有多組測試資料。
每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將在乙個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
當為-1 -1時表示輸入結束。
隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。
output
對於每一組資料,給出一行輸出,輸出擺放的方案數目c (資料保證c<2^31)。
sample input
2 1sample output#..#
4 4...#
..#.
.#..
#...
-1 -1
2source1
蔡錯@pku
然後在做這道題目之前,我們來看一下經典的八皇后問題;
經典的八皇后問題:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
在這種情況下,我最常用的喜歡的的是一種經典的回溯法( 這裡學的,以及有很多其他的方法);
#include#includeusing namespace std;
//dfs,每行只能放乙個元素,遍歷每行的每個位置,用乙個一維陣列記錄,最後檢查是否符合要求
int ans;
int vis[10];
int abs(int x)
bool check(int r,int c)
for(int i = 1;i<=8;i++)
}}main()
for(int s=1;s<=n;s++)
}dfs(x+1,surplus);//假設這一行都不放,再進行下一行的遍歷得結果
}int main()
}dfs(1,k);
cout<}
}
poj 1321 棋盤問題(八皇后變形)
思路 一開始直接暴力dfs,然後被t 其實這題乙個小改動就行了,用兩個陣列記錄這行這列有沒有放過棋子,這樣就不用每次都進行判斷了 如下 include include include include include include include include include include de...
POJ 1321 棋盤問題(dfs八皇后變形)
棋盤問題 time limit 1000ms memory limit 10000k total submissions 25147 accepted 12424 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同...
POJ 1321 棋盤問題
time limit 1000ms memory limit 10000k total submissions 7007 accepted 3390 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列...