zoukankan      html  css  js  c++  java
  • HDU2553 N皇后问题

    原先做过解N皇后问题的程序,就拿来简单改写了一下。有关程序,参见:八皇后(N皇后)问题算法程序
    一提交,“Time Limit Exceeded”,只好先打表。原来的代码注释留在那里了。

    问题链接HDU2553 N皇后问题基础训练题,用C语言编写程序。

    问题简述:(略)。

    问题分析:这是一个经典的回溯法程序,是用递归来实现的,其实也可以用非递归来实现。回溯法并不是必须用递归来实现的。

    程序说明:程序的细节还是需要注意的,例如打表时,需要多声明一个元素,因为数组下标是从0开始。

    AC的C语言程序如下:

    /* HDU2553 N皇后问题 */
    
    #include <stdio.h>
    
    #define TRUE 1
    #define FALSE 0
    #define MAXQUEEN 10
    #define ABS(x) ((x>0)?(x):-(x))  /*求x的绝对值*/
    
    /*存放8个皇后的列位置,数组下标为皇后的列位置*/
    int queen[MAXQUEEN];
    int total_solution;  /*计算共有几组解*/
    
    /* 测试在(row,col)上的皇后是否遭受攻击若遭受攻击则返回值为1,否则返回0 */
    int attack(int row, int col)
    {
        int i, atk=FALSE;
        int offset_row, offset_col;
        i=0;
        while(!atk && i<row)
        {
            offset_row=ABS(i-row);
            offset_col=ABS(queen[i]-col);
            /* 判断两皇后是否在同一列,是否在同一对角线 */
            /* 若两皇后在同列或同对角线,则产生攻击,atk==TRUE */
            atk = (queen[i] == col) || (offset_row == offset_col);
            i++;
        }
        return atk;
    }
    
    /* 递归放置皇后子程序 */
    void place(int q, int n)
    {
        int i=0;
        while(i < n)
        {
            if(!attack(q, i))           /* 皇后未受攻击 */
            {
                queen[q]=i;             /* 储存皇后所在的列位置 */
                /* 判断是否找到一组解 */
                if(q == n-1)
                    total_solution++;   /* 得到一个解 */
                else
                    place(q+1, n);      /* 否则继续摆下一个皇后 */
            }
            i++;
        }
    }
    
    int main(void)
    {
        int n;
        int ans[MAXQUEEN+1], i;
    
        // 因为“Time Limit Exceeded”,只好先打表
        for(i=1; i<=MAXQUEEN; i++) {
            // 皇后遍历
            total_solution = 0;
            place(0, i);                /*从第0个皇后开始摆放至棋盘*/
    
            ans[i] = total_solution;
        }
    
    
        while(scanf("%d", &n) != EOF) {
            // 判断结束条件
            if(n == 0)
                break;
    
            // 皇后遍历
    //        total_solution = 0;
    //        place(0, n);                /*从第0个皇后开始摆放至棋盘*/
    
            // 输出结果
    //        printf("%d
    ", total_solution);
            printf("%d
    ", ans[n]);
        }
    
        return 0;
    }


  • 相关阅读:
    FJNU 1151 Fat Brother And Geometry(胖哥与几何)
    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)
    FJNU 1159 Fat Brother’s new way(胖哥的新姿势)
    HDU 3549 Flow Problem(最大流)
    HDU 1005 Number Sequence(数列)
    Tickets(基础DP)
    免费馅饼(基础DP)
    Super Jumping! Jumping! Jumping!(基础DP)
    Ignatius and the Princess IV(基础DP)
    Keywords Search(AC自动机)
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564658.html
Copyright © 2011-2022 走看看