zoukankan      html  css  js  c++  java
  • 八皇后(N皇后)问题算法程序(回溯法)

    这是一个经典问题,经常出现于各种有关程序与算法的教科书中。

    本问题是求所有可行解,所以要用穷尽搜索,回溯法适合于穷尽搜索。

    本程序使用递归调用的回溯法来解决问题。

    递归的关键是递归调用和结束条件。

    比起非递归的回溯法来,本程序逻辑相对比较简洁,但是时间上会略微慢一些。

    /*
     *
     * 【问题描述】在一个8×8的国际象棋棋盘上放置8个皇后,
     * 要求每个皇后两两之间不“冲突”,即没有一个皇后能“吃
     * 掉”任何其他一个皇后,简单的说就是没有任何两个皇后
     * 占据棋盘上的同一行或同一列或同一对角线,即在每一横
     * 列、竖列、斜列都只有一个皇后。
     *
     * 递归法求出8个皇后问题的解
     * 本程序使用一维数组表示皇后的位置,queen[i]的值表示第i行皇后所在的列
     *
     * 本程序通过修改宏定义MAXQUEEN的值,可以解决N皇后问题。
     *
     */
    
    #include <stdio.h>
    #include <conio.h>
    
    #define TRUE 1
    #define FALSE 0
    #define MAXQUEEN 8
    #define ABS(x) ((x>0)?(x):-(x))  /*求x的绝对值*/
    
    /*存放8个皇后的列位置,数组下标为皇后的列位置*/
    int queen[MAXQUEEN];
    int total_solution = 0;  /*计算共有几组解*/
    
    /*函数原型声明*/
    void place(int);
    int attack(int,int);
    void output_solution();
    
    int main(void)
    {
        place(0); /*从第0个皇后开始摆放至棋盘*/
    
        return 0;
    }
    
    /* 递归放置皇后子程序 */
    void place(int q)
    {
        int i=0;
        while(i<MAXQUEEN)
        {
            if(!attack(q, i)) /* 皇后未受攻击 */
            {
                queen[q]=i; /* 储存皇后所在的列位置 */
                /* 判断是否找到一组解 */
                if(q==MAXQUEEN-1)
                    output_solution(); /* 输出此组解 */
                else
                    place(q+1); /* 否则继续摆下一个皇后 */
            }
            i++;
        }
    }
    
    /* 测试在(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;
    }
    
    /* 输出8个皇后的解 */
    void output_solution()
    {
        int x,y;
        total_solution += 1;
        printf("Solution#%3d
    	",total_solution);
        for(x=0;x<MAXQUEEN;x++)
        {
            for(y=0;y<MAXQUEEN;y++)
            if(y==queen[x])
                printf("Q"); /* 用字母Q表示皇后 */
            else
                printf("-"); /* 用-表示空白 */
            printf("
    	");
        }
        printf("
    ");
    
        getchar();
    }
    

  • 相关阅读:
    www.insidesql.org
    kevinekline----------------- SQLSERVER MVP
    Sys.dm_os_wait_stats Sys.dm_performance_counters
    如何使用 DBCC MEMORYSTATUS 命令来监视 SQL Server 2005 中的内存使用情况
    VITAM POST MORTEM – ANALYZING DEADLOCKED SCHEDULERS MINI DUMP FROM SQL SERVER
    Cargo, Rust’s Package Manager
    建筑识图入门(初学者 入门)
    Tracing SQL Queries in Real Time for MySQL Databases using WinDbg and Basic Assembler Knowledge
    Microsoft SQL Server R Services
    The Rambling DBA: Jonathan Kehayias
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564967.html
Copyright © 2011-2022 走看看