POJ-1321-棋盘问题

这题是深搜。

搜索边界就是当我们走出棋盘并且棋子数目不为0,我们就返回。

另一个边界就是,当棋子数目为0,无论在哪,我们都让方法数加一,然后返回。

搜索的方向就是按行搜索,对列考察,如果是棋盘且此列没放过棋子,那我们就搜索这个点,此列标记为1。

然后对这个点搜索之后,我们就要让这个深搜回溯,清空标记,让for循环的继续执行,考察这行是否还有点可以放。

然后这行也可以选择不放,此时搜索下一行,棋子数目不变。

#include <cstdio>
#include <cstring>
int map[10][10],vis[10];
int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
char s[10];
int n, k, ans;

void dfs(int r,int k)
{
    if (r==n&&k!=0)
        return;
    if (k==0) {
        ans++;
        return;
    }
    for (int j = 0; j < n;j++) {
        if (map[r][j]&&!vis[j]) {
            vis[j] = 1;
            dfs(r + 1, k - 1);
            vis[j] = 0;
        }
    }
    dfs(r + 1, k);
}

int main()
{
    while (scanf("%d%d",&n,&k)&&n!=-1&&k!=-1) {
        memset(map, 0, sizeof(map));
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < n;i++) {
            scanf("%s", s);
            for (int j = 0; j < n; j++) {
                if (s[j]=='#')
                    map[i][j] = 1;
            }
        }
        ans = 0;
        dfs(0, k);
        printf("%d
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xyqxyq/p/10405357.html