poj-1321 棋盤問題
在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。解題思路:按行遞增的順序來搜尋的, 因此不可能出現同行的情況, 對於同列的情況,設定了乙個變數col, 來儲存列的訪問狀態, 對於之前訪問過的列, 棋子是不能再放在這一列上的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 output21
dfs(begin, num) 代表將第k-num棵棋子放在begin行上, 然後就剩下num-1棵棋子需要放在begin行下面. 當然, 可能存在第num棵棋子根本無法放在begin行上的情況, 對於這種情況, dfs就回溯到上乙個dfs呼叫的地方, 重新開始, 而如果遇到num=1, 且第begin行的一些列可以放的話, 就將方案數相應增加.
本題考的就是乙個dfs深搜,理解了dfs這題就相較而言還是簡單的
**如下:
#include/*#include #include*/ //poj不讓用萬能頭
using namespace std;
const int maxn=20;
char pic[maxn][maxn];
int col[maxn];//標記列的訪問狀態
int c;
int n,k;
void dfs(int begin,int num)
} }
}
int main()
printf("%d\n",c);
} }
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...