题目描述
PIPI有一个n*n的棋盘,以及k个棋子,它想把这些棋子摆放到棋盘中去。 同一行同一列只能摆放一颗棋子。
但是棋盘中有些格子是不能摆放棋子的,它想问你一共有多少不同种的摆放方式?
两种摆放方式至少有一颗棋子摆放位置不同时视为不同摆放方式。
#表示可以摆放棋子
.表示不能摆放棋子
输入
多组测试数据
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
输出
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
样例输入
2 1
#.
.#
4 4
…#
…#.
.#…
#…
样例输出
2
1
#include<bits/stdc++.h>
using namespace std;
char ch[10][10];
bool vis[10];
int n,k,ans;
void dfs(int now,int row) ///now表示当前摆的棋子的颗数,row表示上一次放在了第几行
{
if(now==k) {ans++;return;} ///now等于k时,方案数加1
else
{
for(int i=row+1;i<n;i++) ///从第row+1行开始,前row都已经搜索完毕
{
for(int j=0;j<n;j++)///检查row+1行每一列
{
if(!vis[j]&&ch[i][j]=='#')
{
vis[j]=1;
dfs(now+1,i);
vis[j]=0;
}
}
}
}
}
main()
{
while(scanf("%d %d",&n,&k)!=EOF)
{
ans=0;
for(int i=0;i<n;i++)
scanf("%s",ch[i]);
dfs(0,-1);
printf("%d\n",ans);
}
}
版权声明:本文为weixin_44433678原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。