https://vjudge.net/contest/425321#problem/D
原题复制粘贴
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
思路
很像八皇后问题,所以我们还是一行一行的枚举,用col记录某一列有没有被占用就好。
但是呢,一开始有个细节没顾及到。摆放的棋子个数可以小于棋盘大小n,所以完全可以某一行不放棋子。要小心。
代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,k,col[10],ans;
char s[10][10];
void dfs(int step,int r)
{
if(step==k)
{
ans++;
return;
}
if(r>n) return;
int i;
for(i=1;i<=n;i++)
{
if(s[r][i]=='#'&&!col[i])
{
col[i]=1;
dfs(step+1,r+1);
col[i]=0;///注意回溯
}
}
dfs(step,r+1);///注意:可以不选中某一行的任何一个#,直接进下一行
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1) break;
int i,j;
ans=0;
memset(col,0,sizeof(col));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>s[i][j];
}
}
dfs(0,1);
printf("%d\n",ans);
}
return 0;
}