数字华容道界面如下图所示,将 NxN 区域内的 NxN-1 个数字恢复顺序
如果只是将 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
}
}
网友评论