数字华容道随机打乱可能会无解,要打乱成有解需要了解打乱规则,不需要原理可以直接复制代码
原理是逆序数,逆序数是指当前数和后面的所有数比较,如果后面的数小于当前数就是逆序数,把所有数加起来就有奇偶性,拿8数棋盘举例,最后一个是空白(移动块),3*3阶变成数组也就是[1,2,3,4,5,6,7,8,空白],根据规则是空白块上下左右移动,当空白块左右移动的时候会变成[1,2,3,4,5,6,7,空白,8],这时候数字的顺序是不会变的,逆序数为偶数,当空白块上下移动,相当于和(当前位置-阶数)的数字交换,由上一步交换5变成[1,2,3,4,空白,6,7,5,8],这时候逆序数为2也是偶数(6后面有5,7后面有5)形成有解,如果在[1,2,3,4,5,6,7,8,空白]中随机交换两个相邻的数,变成[1,2,3,4,5,7,6,8,空白],这时候逆序数就为1为奇数无解,原理很简单,随机后判断逆序数是否是偶数来判断有解,如果是奇数就交换任意两个相邻的数变成偶数。
///随机九宫格
public RandomCode(){
let arr = [];//1,2,3,4,5,6,7,8
//这里添加数,空白去掉
for (let index = 1; index < 9; index++) {
arr.push(index);
}
//随机打乱
arr.sort((a,b)=>{return Math.random() - 0.5;});
let a:number = 0;
let b:number;
let c:number;
for(let i = 0; i < arr.length; i++) {
b=arr[i];
//只比较后面的
for (let j = i; j < arr.length; j++) {
c = arr[j];
//有一个逆序数就加一
if(b>c){
a+=1;
}
}
}
if(a%2==0){
console.log("偶数");
}
else {
console.log("奇数");
//交换1,2项使其变成偶数
let arr0 = arr[0];
arr[0] = arr[1];
arr[1] = arr0;
}
//输出随机后的数组使用
}