题目大意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,问摆放k个棋子的所有可行的摆放方案个数。
输入:(多个case)
棋盘行列数n 棋子个数k(-1 -1表示结束,n<=8,k<=n)
棋盘第i行形状(#表示棋盘区域 .表示空白区域)
输出:摆放方案个数
分析:深度优先搜索,与八皇后类似,但是只限制了行列不冲突,dfs第i层,看哪一列能摆放棋子。
代码:
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
int ans;
int n,k;
char map[10][10];
int vis[10];
void dfs(int level,int k){
if(level == n && k != 0){
return;
}
if(n - level < k)
return;
if(k == 0){
ans++;
return;
}
for(int i = 0;i < n;i++){
if(map[level][i] != '.' && !vis[i]){
vis[i] = 1;
dfs(level + 1,k - 1);
vis[i] = 0;
}
}
dfs(level + 1,k); //level行不放棋子
}
int main(){
while(~scanf("%d %d",&n,&k)){
if(n == -1 && k == -1)
break;
for(int i = 0;i < n;i++){
scanf("%s",map[i]);
}
ans = 0;
dfs(0,k);
printf("%d\n",ans);
}
return 0;
}