题意:n*n的格子里放k<=n个棋子(不再同一行和同一列)有多少方法。只有标 # 的地方能放棋子。
一道蠢题,太蠢了,不要看。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int n,k;
char s[10][10];
int vis[10];
long long cnt;
long long ans;
void dfs(int x,int y,int cc)
{
if(cc==k) {cnt++;return;}
if(x>=n-1) return;
for(int i=x+1;i<n;i++)
for(int j=0;j<n;j++){
if(s[i][j]=='#'&&!vis[j]){
vis[j]=1;
//cout<<"i"<<i+1<<" "<<j+1<<endl;
dfs(i,j,cc+1);
vis[j]=0;
}
}
}
int main()
{
while(cin>>n>>k&&n!=-1&&k!=-1)
{
ans=0;
for(int i=0;i<n;i++)
scanf("%s",s[i]);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(s[i][j]=='#'){
// cout<<"j"<<i+1<<" "<<j+1<<endl;
memset(vis,0,sizeof(vis));
cnt=0;
vis[j]=1;
dfs(i,j,1);
ans+=cnt;
}
}
}
cout<<ans<<endl;
}
return 0;
}