题目链接:https://vjudge.net/problem/POJ-1321
本题可以使用dfs进行求解。
#include<stdio.h>
#include<string.h>
int n,k;//n为行数;k为棋子数
char a[10][10];//棋盘
int vis[10];//记录一列中是否有棋子
int ans=0,m=0;//ans为方案数;m为已经放置的棋子数
void dfs(int dept) {
if(m==k) {//棋子放完了
ans++;
return ;
}
if(dept>n) {//出界了
return ;
}
for(int i=0; i<n; i++) {//遍历每种情况
if(a[dept][i]=='#'&&vis[i]==0) {//判断当前位置是否是棋盘并且相应列中是否有棋子
vis[i]=1;//标记列
m++;//棋子+1
dfs(dept+1);//深搜
vis[i]=0;//归零
m--;
}
}
dfs(dept+1);//下一行
return ;
}
int main() {
while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1) {
for(int i=0; i<n; i++) {
scanf("%s",&a[i]);
}
dfs(0);
printf("%d\n",ans);
ans=0;
m=0;
}
return 0;
}