AcWing 1114. 棋盘问题
#include<iostream>
using namespace std;
int n,m,ans;
char a[10][10];
int flag[10]; // 列标记
void dfs(int k,int cnt){ // 第k-1行,第cnt-1个棋子
if(cnt==m){
ans++;
return;
}
if(k>=n) return; // 注意此处
for(int i=0;i<n;i++){
if(flag[i]==0&&a[k][i]=='#'){
flag[i]=1;
dfs(k+1,cnt+1);
flag[i]=0;
}
}
dfs(k+1,cnt); // 注意此处
}
int main(){
while(scanf("%d%d",&n,&m)&&(n!=-1||m!=-1)){
for(int i=0;i<n;i++)
scanf("%s",a[i]);
ans=0; // 注意此处更新
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}