**
本文章纯属为了记录自己的acm之路 请高手勿喷 有错误可指出感谢
**
这个题应该是到dfs水题了 #为可放棋子点 整体思路就是深搜每次逐行查找 逐行查找就保证了每行只有一个棋子 并开一个数组记录这每一列上是否有棋子 类似c[i]=1 就是第i列存在棋子 0则反之 ; 结束递归的条件很简单就不多费口舌了
因为这个题最大数据才8 所以可直接暴搜
提供组数据
8 8
########
########
########
########
########
########
########
########
40320
上代码
#include<iostream>
#include<cstring>
using namespace std;
char ch[15][15];
int c[15];
int n,m;
int sum,ans;
void dfs(int x,int k){
if(k==m){
ans++;//如果当前已经放的棋子数等于所要放的棋子数 方案数加1
return ;
}
if(x>=n)//防止出边界
return ;
for(int i=0;i<n;i++){//逐列
if(ch[x][i]=='#'&&c[i]==0){
c[i]=1;
dfs(x+1,k+1);
c[i]=0;//跑完一次需要把列的标记清除
}
}
dfs(x+1,k);//没有放棋子的情况
}
int main(){
while(cin>>n>>m){
if(n==-1&&m==-1)
return 0;
memset(c,0,sizeof(c));//循环输入所以需要清空标记数组
ans=0;//方案数
for(int i=0;i<n;i++)
cin>>ch[i];
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}