[Codewars]-Sudoku Solution Validator

本文介绍了一个用于验证9*9数独是否有效的算法实现。通过确保每一行、每一列及每个3*3的小九宫格内的数字都不重复来判断数独的有效性。提供了两种不同的JavaScript实现方案,一种使用循环和重复检测,另一种采用求和验证的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[Codewars]-Sudoku Solution Validator

题目:
  • 检查9*9数独矩阵是否有效。
  • 根据三个条件判定:
    • 1.每行数字不重复(1~9)
    • 2.每列数字不重复(1~9)
    • 3.9个3*3的九宫格数字不重复(1~9)
思路:
  • 直接解就行
解答:
function validSolution(board){
  //TODO
  var len = board.length ; 
  var fanArr = fan(board)//矩阵翻转
  //判定3*3九宫格
  for(var x = 0 ; x <=6 ; x +=3){
        for(var y = 0 ; y <= 6 ; y += 3){
            var temp = 0
            for(var a = 0 ; a<=2 ; a ++){
                for(var b = 0 ; b <= 2 ; b++){
                    temp +=board[x+a][y+b] 
                }
            }
            if( temp !=45  ){
                return false
                break
            }
        }
     }

    for( let i = 0 ; i < len ; i ++){
        //判定横向
        if( isRepeat(board[i])  ){
            return false
        }
        //判定纵向
        if( isRepeat(fanArr[i])){
            return false
        }
    }
    return true
  function isRepeat(arr){
    arr = arr.sort(function(a,b){return a-b})
    for(var i = arr.length-1 ; i >= 1 ; i --){
        if(arr[i]==arr[i-1]){
            return true
        }
    }
    return false
  }
  function fan(arr){
    var col = arr.length ;
    var cow = arr[0].length;
    var b = [];
    for(var i = 0 ; i < col ; i ++){
        b[i] = []
        for(var j = 0 ; j < cow ; j ++){
            b[i][j] = arr[j][i]
        }
    }
    return b
  }
补充下大神的做法
  • 思路很清晰,横向纵向求和,小九宫格求和
function validSolution(board){
  var sumh = [0,0,0,0,0,0,0,0,0];
  var sumv = [0,0,0,0,0,0,0,0,0];
  osums = [[0,0,0],[0,0,0],[0,0,0]];
  for (var i=0;i<9;i++){
    for (var j=0;j<9;j++){
      sumh[i] += board[i][j];
      sumv[j] += board[i][j];
      osums[Math.floor(i/3)][Math.floor(j/3)] += board[i][j];
    }
  }
  for (var i=0;i<3;i++) if (!osums[i].every(equals45)) return false;
  return (sumh.every(equals45) && sumv.every(equals45));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值