这是之前日常训练的题目,深搜;
棋盘游戏
之前写的时候是看别人的题解写的,现在回过头来看,发现完全没有理解,看来要重新把日常训练的题目看看了。
另外需要加深一下对递归的理解。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
char a[10][10];//QIPAN
int vis[10];//列
int n,k;//N*N K
int ans,m;
void DFS(int hang)
{
int i;
if(m==k)
{
ans++;
return ;
}
if(hang>=n)
return ;
for(i=0;i<=n-1;i++)
{
if(a[hang][i]=='#'&&vis[i]==0)
{
vis[i]=1;
m++;
DFS(hang+1);
vis[i]=0;
m--;
}
}
DFS(hang+1);
}
int main()
{
int i;
while(~scanf("%d%d",&n,&k))
{
ans=0;m=0;
if(n==-1&&k==-1)break;
for(i=0;i<=n-1;i++)
scanf("%s",a[i]);
DFS(0);
printf("%d\n",ans);
}
}