直接用DFS
#include<bits/stdc++.h>
int n,k;
int m,total; //m为已放入的棋子数,total为方案总数
char a[10][10]; //记录棋盘位置
int b[10]; //记录一列是否已有棋子
void DFS(int cur){ //cur为行
if(k==m){ //此处需先判断已放入的棋子数是否以满足要求再判断是否已超出棋盘边界
total++;
return; //return跳出函数
}
if(cur>=n)
return;
for(int j=0;j<n;j++){
if(a[cur][j]=='#'&&b[j]==0){ //放入棋子的条件
m++;
b[j]=1;
DFS(cur+1);
m--;
b[j]=0;
}
}
DFS(cur+1);
}
int main(){
while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1){
m=0;
total=0;
for( int i=0;i<n;i++){
scanf("%s",&a[i]);
}
memset(b,0,sizeof(b));
DFS(0);
printf("%d\n",total);
}
return 0;
}
利用DFS不断的回溯巧妙地解决了同行不同列棋子,同列不同行棋子,重复使用棋盘某一位置以及单个棋子摆放的问题,即使存在空白行或空白列也仍然可以解决问题。