题目内容
和n皇后问题是类似的,只不过这里形状是给定的,在n皇后问题的基础上再加上额外判定条件即可
深搜
AC代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int sum,cur;
int n,k;
char map[10][10];
int place[10];
void dfs(int i)
{
if(cur==k)
{
sum++;
return ;
}
if(i>=n)
return ;
for(int j=0;j<n;j++)
{
if(!place[j]&&map[i][j]=='#')
{
cur++;
place[j]=1;
dfs(i+1);
place[j]=0;
cur--;
}
}
dfs(i+1);
}
int main()
{
while(scanf("%d %d",&n,&k),n!=-1||k!=-1)
{
int i,j;
sum=0;
for(i=0; i<n; i++)
{
getchar();
for(j=0; j<n; j++)
scanf("%c",&map[i][j]);
}
dfs(0);
printf("%d\n",sum);
}
return 0;
}
既然和n皇后问题类似,这里再复习一下
HDU 2553 N皇后问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int a[12],b[12];
int n,sum;
void dfs(int cur)
{
if(cur==n+1)
{
sum++;
return;
}
else
{
for(int i=1;i<=n;i++)
{
b[cur]=i;
int flag=0;
for(int j=1;j<cur;j++)
if(b[j]==i||cur-j==i-b[j]||cur-j==b[j]-i)
{//是否满足题目条件任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上
flag=1;
break;
}
if(!flag)
dfs(cur+1);
}
}
}
int main()
{
for(n=1;n<=10;n++)
{
sum=0;
dfs(1);
a[n]=sum;
}
while(scanf("%d",&n),n!=0)
{
printf("%d\n",a[n]);
}
return 0;
}