题目 中文题目,题意不在赘述,思路代码中。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char mp[10][10];
int vis[10];
int cnt = 0;
int n,k;
/**
采用的是按行递增的顺序来搜索的,
因此不可能出现同行的情况,
对于同列的情况,设置一个变量vis[],来保存列的访问状态,
对于之前访问过的列, 棋子是不能再放在这一列上的.
*/
int dfs(int x,int y)//第x行,放第y颗棋子
{
if(y>=k){
cnt++;//记录这个方案可行
return 0;
}
for(int i=x;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(mp[i][j]=='#'&&!vis[j])
{
vis[j]=1;
dfs(i+1,y+1);//搜素下一行
vis[j]=0;
}
}
}
return 0;
}
int main()
{
while(cin>>n>>k)
{
if(n==-1&&k==-1) break;
for(int i=0;i<n;i++)
cin>>mp[i];
memset(vis,0,sizeof(vis));
cnt = 0;
dfs(0,0);
cout<<cnt<<endl;
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char mp[10][10];
int vis[10];
int res = 0,n,k,cnt=0;
void dfs(int x)
{
if(cnt==k){
res++;
return ;
}
if(x<0||x>=n) return ;
for(int j=0;j<n;j++)
{
if(mp[x][j]=='#'&&vis[j]==0){
cnt++;
vis[j]=1;
dfs(x+1);
vis[j]=0;
cnt--;
}
}
dfs(x+1);
}
int main()
{
while(cin>>n>>k)
{
if(n==-1&&k==-1) break;
for(int i=0;i<n;i++)
cin>>mp[i];
dfs(0);
cout<<res<<endl;
memset(mp,0,sizeof(0));
res = 0;
}
return 0;
}