POJ

题意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

分析:

1、和八皇后很相似,一行一行的放,并判断该列是否放过。

2、唯一注意的是,因为要摆放的棋子数k可能小于棋盘的行数,所以不一定是从第一行开始放的,所以每行的情况都要搜一下。

#include<cstdio>
#include<cstring>
using namespace std;
char pic[10][10];
int n, k;
bool judge(int x, int y){
    return x >= 0 && x < n && y >= 0 && y < n;
}
int ans;
bool vis[10];
void dfs(int cur, int cnt){
    if(cnt == k){
        ++ans;
        return;
    }
    if(cur == n) return;
    for(int i = 0; i < n; ++i){
        if(pic[cur][i] == '#' && !vis[i]){
            vis[i] = true;
            dfs(cur + 1, cnt + 1);
            vis[i] = false;
        }
    }
    dfs(cur + 1, cnt);
}
int main(){
    while(scanf("%d%d", &n, &k) == 2){
        if(n == -1 && k == -1) return 0;
        memset(vis, 0, sizeof vis);
        for(int i = 0; i < n; ++i){
            scanf("%s", pic[i]);
        }
        ans = 0;
        dfs(0, 0);
        printf("%d
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/6657391.html