数字华容道随机代码

数字华容道随机打乱可能会无解,要打乱成有解需要了解打乱规则,不需要原理可以直接复制代码

原理是逆序数,逆序数是指当前数和后面的所有数比较,如果后面的数小于当前数就是逆序数,把所有数加起来就有奇偶性,拿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;
    }
    //输出随机后的数组使用
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值