Openjudge 棋盘问题

棋盘问题

总时间限制:
1000ms
内存限制:
65536kB
描述
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
输入
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
输出
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
样例输入
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
样例输出
2
1
来源
蔡错@pku

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<cstdio>
#include<cstring>
using namespace std;
char array[10][10];
bool line[10],row[10];
int n,k;
int sharp_num;
struct S{
    int i;
    int j;
}R[65];
int DFS(int n,int cur_num){
    if(n>sharp_num){
        if(cur_num==k)return 1;
        return 0;
    }
    if(cur_num==k)return 1;
    if(line[R[n].i]==false||row[R[n].j]==false)return DFS(n+1,cur_num);
    int t=0;
    if(n==0){
        return DFS(n+1,cur_num);
    }
    t+=DFS(n+1,cur_num);
    line[R[n].i]=false;
    row[R[n].j]=false;
    t+=DFS(n+1,cur_num+1);
    line[R[n].i]=true;
    row[R[n].j]=true;
    return t;
}
int main(){
    while(~scanf("%d %d",&n,&k)){
        if(n==-1)break;
        memset(array,'\0',sizeof(array));
        memset(line,true,sizeof(line));
        memset(row,true,sizeof(row));
        sharp_num=0;
        for(int i=1;i<=n;i++){
            scanf("%s",array[i]+1);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(array[i][j]=='#'){
                    sharp_num++;
                    R[sharp_num].i=i;
                    R[sharp_num].j=j;
                }
            }
        }
        printf("%d\n",DFS(0,0));
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注