题目链接:https://cn.vjudge.net/contest/65959#problem/A
题解+代码:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int n,k;
char a[10][10];
int vis[10];//因为不同行,所以记录列
int count=0;//有多少条路径
int way=0;//way在这里表示选择放入棋子的个数
void dfs(int h)
{
int i;
if(way==k)//当所选棋子数等于给定数的时候
{
count++;
return ;
}
if(h>=n)//不能大于棋盘
return ;
for(i=0;i<=n-1;i++)
{
if(!vis[i]&&a[h][i]=='#')
{
vis[i]=1;
way++;
dfs(h+1);//i控制列数,改变h,使数据继续往下搜索
vis[i]=0;//还原 假如第0行有两个# 当从第0行的第一个#开始往下走时,假设第2行中有且只有一个#,并且不与第一行中的任意一个在同一列,那么在往下
way--; //走时就会把这个#标记
}
}
dfs(h+1);//这里问的是棋盘所能摆放的数目,可以不从0开始,只要满足k=way即可
}
int main()
{
int i;
while(scanf("%d %d",&n,&k)!=EOF)
{
count=0;
way=0;
memset(vis,0,sizeof(vis));
if(n==-1&&k==-1)
break;
for(i=0;i<=n-1;i++)
{
scanf("%s",a[i]);
}
dfs(0);
printf("%d\n",count);
}
return 0;
}