js实现八皇后的注释详解

       八皇后问题国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

    思路:试错,类似迷宫

    简述:

            1.

1
行找到第一个合适的位置后直接进入第
2

            2.

2
行找到的位置跟已经放上去的元素做计算,判断是否复合要求(不能攻击),遍历直到找到第一个满足的元            素,直接    进入第三行
            3.

3
行如果所有的元素都不合适,则返回第二行,顺着原来的位置向后找,如果找到合适的元素,再次进入第三          行,如果    第
2
行没有合适的,则跳回第一行,第一行从上一个合适的元素向后寻找。。。。。。
    如何判定不能攻击:
        1.同一列
        2.两个皇后横坐标做差,纵坐标做差,两个差的比值为1或者-1;


        事实上根据这些描述和接下来的代码,要看明白解题过程,依然会有一些困难,即便看明白了,理解不够深,过一段时间依然会忘记,最好的方式就是亲眼看到程序实现的过程,然后逆推程序的流程,真正搞明白解题思路,想要做到这一点,需要借助debugger工具, 代码后面会介绍如何借助debugger观察程序执行过程以及皇后位置的变动,特别是回退,前进的跳转;


代码如下:

//借助debugger能够非常清晰地看到跳转的过程!
       

var n = 8;

        var arr = [];

        function queen( index ) {

            if( index === n ) {

                console.log( arr );//每次完成一种情况,输出数组;

            }else{

                for( var i = 0; i < n; ++i ) {

                    arr[ index ] = i;//为第一行的皇后寻找位置,从0开始,直到7

                    var flag = true;//这里主要是为判定可攻击性提供一个开关,如果在攻击范围内

                    // 则不进入下一列,继续向下寻找,如果找到了合适的位置,则进入下一行

                    for( var j = 0; j < index; ++j ) {

                        //这里是为了判定攻击范围,把所有已经放置的皇后与当前放置的皇后做位置计算,如果在攻击范围内,flag为false,不在所有已经放置的皇后的攻击范围内,则不改变flag的属性:true

                        if( arr[ index ] === arr[ j ] || arr[ index ] – arr[ j ] === index – j || arr[ index ] – arr[ j ] === j – index ) {

                            flag = false;

                            break;

                        };

                    };

                    if( flag ) {

                        //这里是根据flag的属性判定是否进入下一行的循环;

                        queen( index + 1 );

                    }

                }

            }

            

        };

        queen( 0 );//从第0行进行试探

代码中已经标注了debugger的位置;
观察变量: index, arr, flag
逐步执行可以非常清楚地看到程序执行的流程,然后再结合注释理解代码,理解会更加深入!


    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/gohike/article/details/53359691
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞