POJ -- 1321 棋盤問題

題目網址:POJ -- 1321ios

注意這道題目跟八皇后問題不一樣,棋子數量k能夠小於棋盤寬度n(k<=n),致使解的數目增多了。 至關於從棋盤的n行中挑出k行,在對這k行的棋子進行擺放。c++

代碼是典型的深搜,一開始個人dfs裏用了雙層for循環去同時遍歷行列,可是超時了。搜了一下別人的代碼,叫逐行深搜。修改以後AC。spa

#include <cstdio>
#include <iostream>
using namespace std;
char g[10][10];
int v[10];
int n, k;
int ans;
void dfs(int r, int i)  /// 從第r行開始擺放第i個棋子
{
    if(i > k) { ans++; return ;}    /// 注意本行這個條件要放在下個條件以前
    if(r > n) return ;              /// 由於k個棋子都擺放完了之後是容許到達第n+1行的
    for(int c = 1; c <= n; c++)
    {
        if(g[r][c] == '#' && !v[c])
        {
            v[c] = 1;
            dfs(r+1, i+1);
            v[c] = 0;
        }
    }
    dfs(r+1, i);    /// 逐行深搜
}
int main()
{
    while(scanf("%d%d", &n, &k) && n != -1 && k != -1)
    {
        for(int i = 1; i <= n; i++) scanf("%s", &g[i][1]);
        ans = 0;
        dfs(1, 1);
        printf("%d\n", ans);
    }
    return 0;
}

歡迎討論。code

相關文章
相關標籤/搜索