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];//用二维数组存储棋盘

    }

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

  • 相关阅读:
    颜色转换
    颜色转换、随机、16进制转换、HSV
    ColorTransform调整显示对象的颜色值
    unity+统计代码总行数
    Unity加载json数据
    打不开unity编辑器界面,每次默认打开上一次项目,并且报错Error loading file:///C%3A%2FUsers%2FT01017%2FAppData%2FRoaming%2FUnity%2FPackages%2Fnode_modules%2F
    Unity 同一Text文本修改不同的字体大小和字体颜色,加空格
    Unity 限时使用 限制试用时间和使用次数
    unity更改文字透明度
    unity+动画状态机
  • 原文地址:https://www.cnblogs.com/wjcnet/p/3307937.html
Copyright © 2011-2022 走看看