POJ 1321 棋盘问题 --- DFS

  POJ 1321

  题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子。 (注意 .不可放 #可放)

  解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标记,直至放完要求的棋子数。

/*POJ 1321 棋盘问题 --- DFS*/
#include <cstdio>
#include <cstring>

int n, k, cnt;
bool visit[10]; //标记列的访问状态
char mapp[10][10];

/*从第r行开始正确放置p个棋子*/
void dfs(int r, int p){
    if (p == 0){
        ++cnt;
        return;
    }
    if (r >= n || n-r < p) //剪枝 --> n-r >= p才能成功放置
        return;
    for (int j = 0; j < n; ++j){
        if (mapp[r][j] == '#' && !visit[j]){
            visit[j] = 1; //在r行j列放一枚棋子
            dfs(r + 1, p - 1);
            visit[j] = 0;
        }
    }
    dfs(r + 1, p); //由于棋子数小于行数, 可以第r行不放棋子,从下一行开始
}

int main()
{
    while (scanf("%d%d", &n, &k) == 2){
        if (n == -1 && k == -1)
            break;
        cnt = 0;
        memset(visit, 0, sizeof visit);
        for (int i = 0; i < n; ++i){
            scanf("%s", mapp[i]);
        }
        dfs(0, k);
        printf("%d
", cnt);
    }

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/tommychok/p/5020850.html