程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> POJ 1321 棋盤問題(DFS)

POJ 1321 棋盤問題(DFS)

編輯:關於C++

題意 中文

簡單的搜索題 標記列是否已經有子進行深搜即可 k可能小於n 所以每行都有放子或不放子兩種選擇

 

#include 
using namespace std;
const int N = 10;
int n, k, ans, v[N];
char g[N][N];

void dfs(int r, int cnt)
{
    if(cnt >= k) ++ans;
    if(r >= n || cnt >= k) return;
    for(int c = 0; c < n; ++c)   //第r行c列放一個子
        if((!v[c]) && g[r][c] == '#')
            v[c] = 1, dfs(r + 1, cnt + 1), v[c] = 0;
    dfs(r + 1, cnt);   //第r行不放子
}

int main()
{
    while(~scanf("%d%d", &n, &k), n + 1)
    {
        for(int i = 0; i < n; ++i)
            scanf("%s", g[i]);
        dfs(ans = 0, 0);
        printf("%d\n", ans);
    }
    return 0;
}

 

棋盤問題

 

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


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved