#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<map>
#include<vector>
#include<queue>
using namespace std;
char a[16][16];
int m,n,k,sum,num;
bool mm[1666];//用作标记
void dfs(int hang)
{
if(num==k)//当放置的棋子等于题中要求时,方案+1
{
sum++;
return;
}
if(hang>=n)//这种为越过边界范围,
return;
for(int i=0;i<n;i++)
{
if(!mm[i]&&a[hang][i]=='#')//hang行的第i个位置有棋盘,且没有被标记,及该位置可放置棋子
{
mm[i]=1;//可放置,则对第i列进行标记
num++;//放置的棋子数目+1;
dfs(hang+1);//往下一行进行深搜
mm[i]=0;//当执行 num==k 这个操作后,执行这个语句,程序回溯,对上一行的标记消除,
num--;//消除上一行的标记,对应的放置棋子的数目也要-1.
}
}
dfs(hang+1);//正常结束后往下一行深搜。
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1)
break;
memset(mm,0,sizeof(mm));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
sum=0;//多组输入,初始为0;
num=0;
dfs(0);//从第0行开始
cout<<sum<<endl;
}
}
E - 棋盘问题(dfs)
最新推荐文章于 2021-09-15 11:39:24 发布