///题意就是说给你一个n*n的字符型矩阵,再给你k个棋子,要求摆放的k个棋子的任意两个不能在同一行或者同一列(不就是说一定要在斜对面嘛)
///然后就是在所给的字符型矩阵中把所有棋子放在所给的‘#’位置上看有多少种放法;
///思路 dfs走一波水水的就过了;
#include<cstdio>
#include<cstring>
using namespace std;
char str[10][10];
int n,k,ans,step;///step记录满足条件的个数;
bool vis[10];///标记当前列是否被标记;
void dfs(int now)
{
if(step==k)
{ans++;return;}///当当前步数等于棋子的个数时,结束当前走位,得到一种方法;
if(now>=n) return ;
for(int i=0;i<n;i++)
{
if(!vis[i]&&str[now][i]=='#')///当前列没有被访问且当前字符为'#'(因为棋子只能在'#'进行填充)
{
step++;
vis[i]=1;///已经标记走过了;
dfs(now+1);
vis[i]=0;///就是走完上一个dfs后记得回标,因为当前节点在下一次的走位中可能满足条件;就是说存在斜行黏在一起的情况
/*
4,2;
#***
*#**
**#*
*/
step--;
}
}
dfs(now+1);
}
int main ()
{
while(~scanf("%d %d",&n,&k))
{
if(n==k-&&k==-1) break;
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%c",&str[i][j]);
}
getchar();
}
ans=0;
step=0;
memset(vis,0,sizeof(vis));
dfs(0);
printf("%d\n",ans);
}
return 0;
}
POJ-1321棋盘问题
最新推荐文章于 2020-05-31 10:08:53 发布