美文网首页
微信小程序:数字华容道 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