美文网首页
微信小程序:数字华容道 klotski

微信小程序:数字华容道 klotski

作者: 我的小小笔尖 | 来源:发表于2022-01-10 21:41 被阅读0次

    数字华容道界面如下图所示,将 NxN 区域内的 NxN-1 个数字恢复顺序

    klotski.JPG

    如果只是将 NxN-1 个数字随机打乱顺序,有时候是无法恢复的

    生成数字华容道的代码:

      // 生成数字华容道关卡
      generateKlotski(lv) {    
        let arr1 = []
        let arr2 = []
        // 添加 lv * lv - 1 个数字
        for(var i=1; i<lv*lv; i++) {
          arr1.push(i)
        }
        // 乱序
        arr1.sort(() => Math.random() - 0.5)    
        // 判断逆序数是否为偶数对,如不是则无解,需要重新随机
        let _inverse = 0
        for (var x = 0; x < arr1.length - 1; x++) {
          for (var y = x + 1; y < arr1.length; y++) {
            if (arr1[x] > arr1[y]) {
              _inverse = _inverse + 1
            }
          }
        }
        let solveFlg = true // true:有解,false:无解
        if (_inverse == 0) {
          console.info(arr1)
          console.info("逆序数:" + _inverse + ",已排好序,需重新生成")
          solveFlg = false
        } else if (this.data.klotskiLevel % 2 == 1) { // 奇数列,逆序数必须是偶数
          if (_inverse % 2 != 0) {
            console.info(arr1)
            console.info("逆序数:" + _inverse + ",无解,重新生成")
            solveFlg = false
          } else {
            console.info(arr1)
            console.info("逆序数:" + _inverse + ",有解")        
          }
        } else { // 偶数列,空格在偶数行,逆序数必须是奇数
          if (_inverse % 2 == 1) {
            console.info(arr1)
            console.info("逆序数:" + _inverse + ",无解,重新生成")
            solveFlg = false
          } else {
            console.info(arr1)
            console.info("逆序数:" + _inverse + ",有解")
          }
        }
        // 添加空白处的数字
        arr1.push(9999) 
        // 一维数组转二维数组 
        let _temp = []
        for (var j = 0; j < arr1.length; j++) {
          _temp.push(arr1[j])
          if (j % lv == lv - 1) {
            arr2.push(_temp)
            _temp = []
          }
        }
        // 将生成的华容道数据存储 
        this.setData({
          p1List: arr2,
          p1Arr1: arr1,
        })
        return solveFlg
      }, 
    

    onLoad 中调用方法生成数字华容道

        // 生成数字华容道(最多尝试100次)
        for(let i=0; i<100; i++) {
          if(this.generateKlotski(this.data.klotskiLevel)) {
            // 有解,则跳出
            break
          }      
        }
    

    相关文章

      网友评论

          本文标题:微信小程序:数字华容道 klotski

          本文链接:https://www.haomeiwen.com/subject/lldvcrtx.html