题目链接:http://poj.org/problem?id=1321
很久没有敲搜索了啊,今天敲了个水题练练手,哈哈。。。。
题目大意: 就是求在n*n的方格上放置k个棋子的方案数
代码:
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;
int n,k;
char map[][];
int visit[];
int sum;
int ans;
bool Jude(int k,int num)
{
int i;
if(k==-) return ;
if(map[num][k]=='.') return ;
for(i=;i<num;i++)
if(k==visit[i]) break;
if(i== num ) { visit[num]=k; sum++; return ;}
else return ;
}
void dfs(int row)
{
if(sum==k) {ans++;return ;}
if(row ==n && sum<k) return ;
int i=-;
while(i<n)
{
if(Jude(i,row))
{
dfs(row+);
if(i>=) { visit[row]=-;sum--;}
}
i++;
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==- && k==-) break;
for(int i=;i<n;i++) scanf("%s",map[i]); memset(visit,-,sizeof(visit));
sum=;
ans=;
int i=-;
while(i<n)
{
if(Jude(i,))
{
dfs();
if(i>=) { visit[]=-;sum--;}
}
i++;
}
cout<<ans<<endl; }
return ;
}