1019-N皇后问题



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[n]=tmp;
    }
    while(scanf("%d",&m),m)
    {
        printf("%d\n",ans[m]);
    }
    return 0;
}










你可能感兴趣的:(搜索)