• HDU 2553 N皇后问题 (深搜)


    题目链接

    Problem Description

    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。

    你的任务是,对于给定的N,求出有多少种合法的放置方法。

    Input

    共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

    Output

    共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

    Sample Input
    1
    8
    5
    0

    Sample Output
    1
    92
    10

    分析:

    就是简单的深搜在放的同时找合适的位置,但是要先打表,不然会超时。

    代码:

    #include <cstdio>
    #include <cmath>
    #include<iostream>
    using namespace std;
    int qizi[20];//qizi[i]=j表示 第i行第j列下有棋
    int biao[11];//结果存到表中,不存会超时
    int n;
    int qingkuang;
    bool judge(int hang)
    {
        for(int i=1; i<hang; i++) //扫之前下过棋每一行是否有与此次所下棋的位置同列的 或同对角线的
        {
            if(qizi[i]==qizi[hang]||abs(hang-i)==abs(qizi[hang]-qizi[i]))//对角线的话斜率的绝对值=1
                return false;
        }
        return true;
    }
    
    void dfs(int hang)
    {
        if(hang==n+1)//比如n=2,然后该第二行下棋了,第二行如果能成功选择的话,那么那么新的行数3就等于n+1=3了 ,实在不懂举个例子看看
            qingkuang++;
        else
        {
            for(int j=1; j<=n; j++) //在该行选第几列
            {
                qizi[hang]=j;
                if(judge(hang))
                {
                    dfs(hang+1);//在本行能下棋的话,就接着下下一行的棋
                }
            }
        }
    }
    
    int main()
    {
        for(n=1; n<=10; n++)
        {
            qingkuang=0;
            dfs(1);
            biao[n]=qingkuang;
        }
        int q;
        while(scanf("%d",&q)!=EOF)
        {
            if(q==0)
                break;
            printf("%d
    ",biao[q]);
        }
        return 0;
    }
    
  • 相关阅读:
    第12课 计算器核心解析算法(上)
    第11课 Qt中的字符串类
    第10课 初探 Qt 中的消息处理
    第9课 计算器界面代码重构
    第8课 启航!第一个应用实例
    第7课 Qt中的坐标系统
    第6课 窗口部件及窗口类型
    第5课 Qt Creator工程介绍
    第4课 Hello QT
    给Linux内核增加一个系统调用的方法(转)
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6768065.html
Copyright © 2020-2023  润新知