题目大意就是:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列。
很经典的一道深搜题,也比较简单,这个先敲出来当作模板放这里,哈哈。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,vis[10],res;
char map[10][10];
void dfs(int step,int line)
{
if(line == n + 1|| step == k)
{
if(step == k)
res++;
return;
}
dfs(step,line + 1);
for(int i = 0;i < n; i++)
{
if(map[line][i] == '#' && !vis[i])
{
vis[i] = 1;
dfs(step + 1,line + 1);
vis[i] = 0;
}
}
return;
}
int main()
{
while(1)
{
res = 0;
scanf("%d %d",&n,&k);
if(n == -1 && k == -1) break;
memset(vis,0,sizeof(vis));
for(int i = 0;i < n; i++)
{
scanf("%s",map[i]);
getchar();
}
dfs(0,0);
printf("%d\n",res);
}
}