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

相关文章
相关标签/搜索