题目链接
http://poj.org/problem?id=1321
思路
由于是北大OJ所以代码部分万能头文件不能用,整体思路就是按行枚举,找到‘#’同时判断对应行列标记数组是否已经被标记,本题唯一的坑在于,按行遍历的起始行需要在上一层的行数基础上+1枚举下一行,否则会导致后面的与前面重复配对,而且你还没来得及WA就TLE了。
c++代码
#include<iostream>
#include<stdio.h>
using namespace std;
char a[9][9];
int col[9]={0};
int n,k;
int sum=0;
void dfs(int u,int x)
{
if(u==k)
{
sum++;
return;
}
else
{
for(int i=x;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='#'&&!col[j])
{
col[j]=1;
dfs(u+1,i+1);
col[j]=0;
}
}
}
}
}
int main()
{
while(1)
{
scanf("%d%d",&n,&k);
if(n==-1&&k==-1)
{
break;
}
else
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
}
dfs(0,0);
printf("%d\n",sum);
sum=0;
}
return 0;
}