POJ1321题解
有N X N的矩阵,其中#为可以放棋子的地方,问放k个棋子能有多少种方法,一眼就知道是dfs,不过如果n==k的时候好做,可是如果k < n 的时候应该如何dfs呢,想了好一会,具体见代码注释
代码
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define MAX 100000
#define LL long long
int cas=1,T;
char mapp[10][10];
int sum;
int col[10];
int n,k;
void dfs(int row,int num)
{
if (num==k)
{
sum++;
return;
}
if (row>n)
return;
for (int j=1;j<=n;j++)
{
if (mapp[row][j]=='#' && !col[j])
{
col[j]=1;
dfs(row+1,num+1);
col[j]=0;
}
}
dfs(row+1,num);
return;
}
int main()
{
while (scanf("%d%d",&n,&k) && n!=-1)
{
memset(col,0,sizeof(col));
memset(mapp,0,sizeof(mapp));
for (int i = 1;i<=n;i++)
for (int j = 1;j<=n;j++)
cin >>mapp[i][j];
sum=0;
dfs(1,0);
printf("%d\n",sum);
}
return 0;
}