题目链接:http://poj.org/problem?id=1321
解题思路:
DFS,没想法就很难很难,有想法就很容易的题
棋盘规则与否不是难点,无论规则不规则都可以用标记去解决
难点在于 棋盘的行数(列数)n 与 待摆放的棋子总数k 的关系为k<=n
K==n时还是比较好办的
K<n时就让人有点迷糊不知怎样处理了
网上普遍做法都是 逐行深搜,效率不错,我也稍微借鉴了,
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,status;
int visited[9],dict[9][9];
void dfs(int row,int num){
if(num==n){
status++;
return ;
}
if(row>k)
return ;
for(int j=1;j<=k;j++){
if(dict[row][j]&&!visited[j]){
visited[j]=true;
dfs(row+1,num+1);
visited[j]=false;
}
}
dfs(row+1,num);
return;
}
int main(){
char ch;
while(~scanf("%d%d",&k,&n)){
if(n==-1 && k==-1)
break;
getchar();
memset(dict,0,sizeof(dict));
memset(visited,0,sizeof(visited));
status=0;
for(int i=1;i<=k;i++){
for(int j=1;j<=k;j++){
ch=getchar();
if(ch=='.')
dict[i][j]=0;
else
dict[i][j]=1;
}
getchar();
}
dfs(1,0);
printf("%d\n",status);
}
}