zoukankan      html  css  js  c++  java
  • 八皇后问题详细分析与解答(递归法解答,c#语言描述)

    皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
    高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

                                                                

      解决八皇后问题,要分成几个步骤。

      第一步:思考要解决的问题

    1.用什么数据结构来描述棋盘,怎样描述棋盘。

    2.怎样描述皇后(包括皇后的位置,怎样移动皇后等)。

    3.怎样开始程序。

    第二步:初步解决问题,列出大纲

    1.我们用一个名为Queens的类来表达皇后,用一个方法来向棋盘中插入新的皇后,函数的参数就是皇后的一个对象,定义函数为solve_from(Quenns configuration)

    2.sove_from(Queens configuration)方法框架,只是伪代码(下面的步骤会详细写这个函数)

    public void solve_from(Queens configuration)

    {

      if  Queens configuration表明八个皇后已经全部放入棋盘

         打印出八个皇后所在的位置

        else

           循环棋盘的第n行(第n-1行有皇后,第n行没有皇后)可以放皇后的每个格子

    {

       在该行增加一个皇后;

    solve_from(configuration);

    将皇后从configuration的格子中移走

    }

    }

    3.Queens类定义大纲

    内置函数

    ①.bool unguarded(int col)    方法说明:根据首个空行,第count行第col列中的格子是否未被任何皇后设防而返回true或者false。(所谓设防就是一个皇后所导致的不允许放其他皇后的位置)

    ②.void insert(int col)  方法说明: 在第count行第col列插入一个皇后,前提是该格子未被任何皇后设防,增加皇后后行数count加一

    ③. void remove(int col)  方法说明: 移去count行col列里面的皇后,count减去1

    ④.is_solved()  方法说明: 判断皇后的个数是不是等于8 如果等于8则返回true 否则返回false

    ⑤. print()  方法说明:打印所有皇后的位置

    第三步:细化解决问题

    主函数 main

    int main()

    {

      Queens configuration(8);

    solve_from(configuration);

    }

    函数solve_from(Queens configuration)

    void solve_from(Queens configration)

    {

     if(configuraton.is_solved())

        configuration.print();

    else

    for(int col=0;col<8;col++)

    {

       if(configuration.unguarded(col))

    {

    configuration.insert(col);

    solve_from(configuration);//这里是一个递归,仔细思考,想通的话,其乐无穷

    configuration.remove(col);

    }

    }

    }

    类Queens

    class Queens{

    bool is_solved(){if(count>8)return true;else return false;}

    void print(){

    for(int i=0;i<8;i++)

    {

       for(int j=0;j<8;j++)

    {

       if(queen_square[i][j]==true)

    {

       Console.Write(i+"_"+j);

    }

    }

    }

    }

    bool unguarded(int col){

    int i;

    bool ok=true;

    for(i=0;ok&&i<count;i++)

    ok=!queen_square[i][col];

    for(i=1;ok&&count-i>0&&col-i>=0;i++)

    ok=!queen_square[count-i][col-i];

    for(i=1;ok&&count-i>0&&col+i<8;i++)

    return !queen_square[count-i][col+i];

    return ok;

    }

    bool insert(){queen_square[count][col]=true;count++;}

    void remove(queen_square[count][col]=false;count--;);

    int count;

    bool queen_square[8][8];//用二维数组存储棋盘

    }

    总结:八皇后问题递归法解答感觉困难,实际上做起来只要思路清晰并不复杂,这个程序还可以优化,以后会续写

  • 相关阅读:
    1082 射击比赛 (20 分)
    1091 N-自守数 (15 分)
    1064 朋友数 (20 分)
    1031 查验身份证 (15 分)
    1028 人口普查 (20 分)
    1059 C语言竞赛 (20 分)
    1083 是否存在相等的差 (20 分)
    1077 互评成绩计算 (20 分)
    792. 高精度减法
    791. 高精度加法
  • 原文地址:https://www.cnblogs.com/wjcnet/p/3307937.html
Copyright © 2011-2022 走看看