写了一发简单暴搜发现好久不写自己已经不熟练了(wa了几发)
wa的原因是我的代码实现出来是从第i行开始每次在下一行都选棋子放
但其实可以选择跳过这一行不放 下一行放....
so 代码如下(main里面注释的是之前错误的写法)
//
// Created by xingchaoyue on 2019/4/24.
//
#include<iostream>
#include<cstdio>
using namespace std;
int n,k;
char mp[10][10];
int vis[10][10];
int row[10];
int col[10];
int res = 0;
void dfs(int u, int num){
if(num==k){
res++;
return;
}
if(u>=n)
return;
for(int i =0;i<n;++i){
if(mp[u][i]=='#'&&!col[i]){
col[i] = 1;
dfs(u+1,num+1);
col[i]=0;
}
}
dfs(u+1,num);
}
int main(){
while(~scanf("%d%d",&n,&k)&&n!=-1&&k!=-1){
res = 0;
memset(mp,0,sizeof(mp));
for(int i =0;i<n;++i){
scanf("%s",mp[i]);
}
dfs(0,0);
/*
for(int i = 0;i<n;++i){
memset(col,0,sizeof(col));
dfs(i,0);
}*/
cout<<res<<endl;
}
}