一道简单的深搜题,深搜函数的参数为当前行数和剩余需要摆放的棋子数,对每行每个可放的棋子位置进行深搜,或者该行不放棋子。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
#define maxn 10
int n,k,num;
bool vis[maxn];//判断列是否已经有棋子
int maps[maxn][maxn];
int ans;
void dfs(int h,int last)//h为当前行 那么还剩下n-h行 last为还需要摆的棋子个数
{
if(last==0)
{
ans++;
return ;
}
if(h==n)return;
if(last>n-h) //剪枝 剩余行数小于剩余棋子数 那么一定不可能实现
{
return ;
}
for(int i=0;i<n;i++)//深搜这一行的每个位置
{
if(maps[h][i]==1&&!vis[i])
{
vis[i]=1;
dfs(h+1,last-1);
vis[i]=0;
}
}
dfs(h+1,last);//如果这行不放棋子的话
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1)break;
char s[10];
memset(vis,false,sizeof vis);
num=0;
for(int i=0;i<n;i++)
{
scanf("%s",s);
for(int j=0;j<n;j++)//初始化
{
if(s[j]=='#')maps[i][j]=1,num++;
else maps[i][j]=0;
}
}
ans=0;
dfs(0,k);
printf("%d\n",ans);
}
return 0;
}