算法题:有效的数独

leetcode 地址:有效的数独


思路

就按照数独的规则来判断,有三条:

  1. 横向数字不重复
  2. 纵向数字不重复
  3. 3x3 的范围内不重复

循环依然利用深度优先的思路。

代码

➥ JavaScript

/**
 * @param {character[][]} board
 * @return {boolean}
 */
var isValidSudoku = function(board) {
  const boardT = [] // 矩阵转置,用于判断纵向有没有重复
  for (let row = 0; row < 9; row++) {
    for (let col = 0; col < 9; col++) {
      !boardT[col] && (boardT[col] = [])
      boardT[col][row] = board[row][col]
    }
  }

  const check = (row, col, num) => {
    const r = Math.floor(row / 3)
    const c = Math.floor(col / 3)
    let block = []

    // 将当前元素剔除,以免和自己比较导致失败
    board[row][col] = '.'
    boardT[col][row] = '.'

    // 规则1:判断横向有没有重复数字
    if (board[row].indexOf(String(num)) > -1) {
      return false
    }

    // 规则2:判断纵向有没有重复数字
    if (boardT[col].indexOf(String(num)) > -1) {
      return false
    }

    // 规则3:判断3x3里面有没有重复数字
    for (let i = 0; i < 3; i++) {
      block = block.concat([
        board[3 * r + i][3 * c],
        board[3 * r + i][3 * c + 1],
        board[3 * r + i][3 * c + 2]
      ])
    }
    if (block.indexOf(num) > -1) {
      return false
    }

    // 恢复当前元素
    board[row][col] = num
    boardT[col][row] = num

	// 顺利冲过三关,返回 true
    return true
  }

  const dfs = row => {
    if (row === 9) return true

    let flag = true
    for (let col = 0; col < 9; col++) {
      const num = board[row][col]
      if (num === '.') {
        continue
      } else {
        if (!check(row, col, num)) {
          flag = false
          break // 有一个错误就直接结束判断
        }
      }
    }

    return flag ? dfs(row + 1) : false
  }

  return dfs(0)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值