1. 程式人生 > >搜尋A 棋盤問題 POJ - 1321

搜尋A 棋盤問題 POJ - 1321

棋盤問題

#acm/搜尋#

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
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std; const int MAXN = 100; char map1[MAXN][MAXN]; int vis[MAXN]; int n, k; int ans, chess; // 一行一行搜,或者一列一列搜 void dfs(int state){ if(chess == k) { ans++; return; } if(state > n) return; for(int j = 1; j <= n; ++ j){ if(map1[state][j] == '#' &&
!vis[j]){ chess++; vis[j] = 1; dfs(state+1); chess--; vis[j] = 0; } } dfs(state + 1); return; } int main() { ios::sync_with_stdio(false); while(cin>>n>>k && n != -1){ memset(vis, 0, sizeof vis); ans = chess = 0; for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) cin >> map1[i][j]; dfs(1); cout << ans <<endl; } return 0; }