<small id='TDRP'></small> <noframes id='lrzs4Xax'>

  • <tfoot id='IufHCl'></tfoot>

      <legend id='RcmkitEGFW'><style id='7D6TJFCdV'><dir id='97as6KFt'><q id='zeMTBn1yS'></q></dir></style></legend>
      <i id='nEhOs5G'><tr id='8xNEa6Tykf'><dt id='fkguDMX'><q id='0HeCx'><span id='NAcpE7tPBV'><b id='niMc5U'><form id='7Ogb5P'><ins id='jC1oyOKnag'></ins><ul id='nqe1'></ul><sub id='eDV4s'></sub></form><legend id='AzoO'></legend><bdo id='NkBs'><pre id='1yKORFvSkN'><center id='yX63BCja'></center></pre></bdo></b><th id='6en9dH7a'></th></span></q></dt></tr></i><div id='Zm1IH9'><tfoot id='v4IPGmf'></tfoot><dl id='I3Rh'><fieldset id='PCEzF1'></fieldset></dl></div>

          <bdo id='kA0s9ScY'></bdo><ul id='tUM1Ll24h6'></ul>

          1. <li id='CWXAanD'></li>
            登陆

            多宝平台1号站-扫雷与算法:怎么随机化的布雷(一)

            admin 2019-07-07 212人围观 ,发现0个评论

            程序员小吴

            读完需求

            5
            分钟

            速读仅需2分钟


            这是经过「扫雷与算法」小程序来解说算法的第一章:怎么随机化的进行布雷,首要介绍了三种不那么好的办法,期望经过这些欠好的办法能让咱们理解第二章要解说的「洗牌算法」有多牛逼。

            弥补:「扫雷与算法」小程序会在写完后进行开源,发布在我的 GitHub 上面。

            办法一

            最想当然的办法便是随机的在二维区间寻觅一个点布雷即可,代码如下:

            for (var i = 0; i < mineNumber; i++) {
                   var row = t叫花鸡his.rangeRandom(0this.rowCount - 1);
                   var col = this.rangeRandom(0this.colCount - 1);
                   //运用数字 9 表明该区域有雷
                   tmpMineMap[row][col] = 9;
             }

            这种完成逻辑的一个坏处便是会在现已布雷的方位再度布雷,从而导致整个区域的布雷数量与要求不符合。

            如上图所示,需求布雷的个数为 5 ,但在最终一次的随机布雷进程中只埋了 4 颗雷。

            办法二

            办法二是对办法一的改进:既然会重复埋雷,那么只需求再埋雷的进程中判别一下该方位是否现已埋雷即可。

            • 假如该方位是空的,那么则布雷,然后进行寻觅新的方位布下下一颗雷

            • 假如该方位现已被安顿了雷,那么就需求从头生成一个方位来安顿

            代码如下:

               for (var i = 0; i < mineNumber; i++) {
                  //经过死循环来完成不断的寻觅,直到安顿好雷
                  while (true) {
                    var row = this.rangeRandom(0this.rowCount - 1);
                    var col = this.rangeRandom(0this.colCount - 1);
                    //用数字 9 表明该区域有雷,假如该方位没有布雷,那么则放置
                  &多宝平台1号站-扫雷与算法:怎么随机化的布雷(一)nbsp; if (tmpMineMap[row][col] != 9) {
                       tmpMineMap[row][col] = 9;
                       //跳出循环多宝平台1号站-扫雷与算法:怎么随机化的布雷(一)
                       break;
                    }
                  }
                }

            运用作用如下:

            作用形似挺好的,但小伙伴们或许现已留意到了,上面的代码中有一段 死循环 代码,这就意味着假如棋盘很大,雷区许多,而且你的命运还不够好的话,那么就有或许一直在履行这段 死循环 代码,从而导致程序的卡死溃散。

            尽管没有卡死,但履行时间好久,再多的话就会出问题

            办法三

            第三种办法是先将雷安顿在最前面,然后再不断的打乱。

            完成代码如下:

            //先按次序排列
            for (var i = 0; i < mineNumber; i++) {
                var row = parseInt(i / this.colCount);
                var col = i % this.colCount;
                //运用数字 9 表明该区域有雷
                tmpMineMap[row][col] = 9;
            }

            //界说交流的次数,次数越多越紊乱随机
            var swapTime = 100;
            for (var i = 0; i < swapTime; i++) {
                //随机方位1
                var row1 = this.rangeRandom(0this.rowCount - 1);
                var co多宝平台1号站-扫雷与算法:怎么随机化的布雷(一)l1 = this.rangeRandom(0this.colCount - 1);
                //随机方位2
                var row2 = this.rangeRandom(0this.rowCount - 多宝平台1号站-扫雷与算法:怎么随机化的布雷(一);1);
                var col2 = this.rangeRandom(0this.colCount - 1);
                //交流两个方位
                var多宝平台1号站-扫雷与算法:怎么随机化的布雷(一) temp = tmpMineMap[row1][col1];
                tmpMineMap[row1][col1] = tmpMineMap[row2][col2];
                tmpMineMap[row2][col2] = temp;
            }

            这种办法的一个坏处便是关于 swapTime 的依靠程度很高,假如设置的交互次数少了,大部分雷都仍是依照一开始的次序安顿,都在最前面的方位,悉数的雷并不是随机排放。

            最重要的一点是:每个方位安顿雷的概率并不是等或许的,也就意味着它不能做到随机化。

            我尝试过在小程序上进行概率模仿,搞了半天也没弄好,每次都会卡死,后续发现能优化持续模仿出概率来的话再补上。

            总结

            在大部分情况下,办法二 与 办法三 是能够满意咱们随机化处理的进程的,但办法二有或许运转卡死溃散,办法三中每个方位安顿雷的概率并不是等或许的。

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP