您的位置:首页 > 其它

2016sdau课程练习专题二 1019

2016-04-23 18:40 260 查看
1.题目编号

1019

2.简单题意

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。<br>你的任务是,对于给定的N,求出有多少种合法的放置方法。

3.思路
就是考虑一下皇后放置的位置,每一行都要枚举每个可以放置皇后的位置,并且判断这个位置是否与前一个放置好的位置相冲突,若冲突则此位置不合适,若不冲突则进行下一行的枚举,直至n行

4.感想

深度搜索的问题,虽然做过一下,还有老师例题的引导,但还是很懵圈啊

5.代码

#include<stdio.h>

#include<string.h>

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)  

                {

                    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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: