B - 棋盘问题 POJ - 1321
dfs模板
#include<stdio.h>
#include<iostream>
using namespace std;
int n, k, vis[10][10], ans, num;
char map[10][10];
bool check(int dep, int j)
{
if(dep > n || dep < 1 || j > n || j < 1 || map[dep][j] != '#')
return 0;
for(int i = 1; i <= dep; i++)
if(vis[i][j])
return 0;
return 1;
}
void dfs(int dep)
{
if(num == k)
{
ans++;
return;
}
if(dep > n)
return;
for(int i = 1; i <= n; i++)
{
if(check(dep, i))
{
num++;
vis[dep][i] = 1;
dfs(dep+1);
vis[dep][i] = 0;
num--;
}
}
dfs(dep+1);
}
int main()
{
while(~scanf("%d %d", &n, &k) && (n != -1) && (k != -1))
{
ans = 0;
num = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
cin>>map[i][j];
vis[i][j] = 0;
}
dfs(1);
cout<<ans<<'\n';
}
return 0;
}