您的位置:首页 > 其它

1019-N皇后问题

2016-04-22 18:27 246 查看
1.题号:1019-N皇后问题

2.题意:很老的却又很经典的题,就是在一个棋盘上放8个皇后,皇后的攻击范围是横着,竖着,斜着,要求和平共处,互不伤害。

3.解题思路:深搜每一个位置,对于每一行所有的位置都枚举一遍,然后限制条件就是横竖斜。首先N为1-10时,把不同的种类方法,然后放在一个数组里,相当于预处理,具体是求解每个N所对应的种类方法了。循环里面主要是一个深搜函数,参数每次从1其,先排列第一个皇后在第一行,从1直到N,一个循环,再增加一个黄昏在下一行,并判断列和行是否与前面的冲突,可以用一个bool函数来实现,用递归实现。

4.感悟:曾看见过8皇后问题,对比一下,还是有相似的思想,很经典的一道题。

5.AC 代码:

#include<stdio.h>
#include<iostream>
#include<string.h>

using namespace std;

int n,tmp;
int map[11];

void DFS(int k)
{
int i,j,flag;
if(k==n+1)
{
tmp++;
return;
}
else
{
for(i=1;i<=n;++i)
{
map[k]=i;
flag=1;
for(j=1;j<k;++j)
{
if(map[j]==i||i-k==map[j]-j||i+k==map[j]+j)///注:i=map[k];不在同一条斜线的两点的含义是行标到对角线的的距离不相等
{
flag=0;
break;
}
}
if(flag)
DFS(k+1);
}
}
}

int main()
{
int i,m;
int ans[11];
for(n=1;n<=10;++n)
{
tmp=0;
DFS(1);
ans
=tmp;
}
while(scanf("%d",&m),m)
{
printf("%d\n",ans[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索