当前位置: 首页 > 知识库问答 >
问题:

如何动态查找数独子框值

冯宏浚
2023-03-14

我正在尝试制作一个算法来动态检查是否解决了常规数独网格。我有一个硬编码的解决方案,通过使用盒子内所需值的坐标来获取每个子盒子的值。然而,我似乎无法弄清楚如何编写一个函数,只需查看数独矩阵的大小和我想要的盒子,它就会输出该盒子部分内的值。

我的代码:

const sudoku = [
  [1, 2, 3, 4],
  [3, 4, 1, 2],
  [2, 3, 4, 1],
  [4, 1, 2, 3]
]

class SudokuChecker {

  getCheckList (length) {
    const nums = {}
    for (let i=1; i<=length; i++) nums[i] = 0
    return nums 
  }

  isCorrect (list) {
    const checkList = this.getCheckList(list.length)
    list.forEach(num => checkList[num]++)
    return Object.values(checkList).every(x => x == 1)
  }

  getRow (matrix, row) {
    return matrix[row]
  }

  getColumn (matrix, col) {
    return matrix.map(row => row[col])
  }

  getBox (matrix, box) {
    const procNum = Math.sqrt(matrix.length)
    // given some box ID number (starting at 0), all I need :
    // a) index of that box's top row
    const topRow = 'find_me' // calculated with "box" and procNum somehow...
    // b) the index of that box's first num at that row.
    const sliceFrom = 'find_me' // no idea at the moment how to calculate...
    let boxNums = []
    for (let i=0; i<procNum; i++) {
      boxNums = boxNums.concat(matrix[topRow + i].slice(sliceFrom, sliceFrom + procNum))
    }
    return boxNums
  }

  checkLists (matrix, type, unit=0) {
    const pass = this.isCorrect(this['get'+type](matrix, unit))
    if (!pass) return false
    if (unit == matrix.length-1) return pass
    return this.checkLists(matrix, type, ++unit)
  }

  checkAll (matrix) {
    const types = ['Row', 'Column', 'Box']
    return types.map(t => this.checkLists(matrix, t)).every(x => x === true)
  }

}

共有1个答案

鞠乐
2023-03-14

我在朋友的帮助下得到的答案:

getBox (matrix, box) {
  const procNum = Math.sqrt(matrix.length)
  const topRow = Math.floor(box/procNum) * procNum
  const sliceFrom = (box % procNum) * procNum
  let boxNums = []
  for (let i=0; i<procNum; i++) {
    boxNums = boxNums.concat(matrix[topRow + i].slice(sliceFrom, sliceFrom + procNum))
  }
  return boxNums
}
 类似资料:
  • 问题内容: 使用HTML,将创建一个复选框,如下所示: 使用javascript,我们可以选中以下复选框: 现在,我正在尝试使用jquery-mobile创建相同的页面。该复选框如下所示: 为什么这里没有呢?是这个名字吗?我应该删除属性名称并使用名称创建一个吗? 如何在此处使用Javascript / jQuery选中此复选框? 我尝试了上面的代码,但似乎不适用于此复选框。 问题答案: 您需要使用

  • 我有一个动态的形式,下面是结构 > 类添加到父类 将is_required下的所有复选框换行如下 我可以在is_required上循环,然后找到checkboxes_required,如下所示,但不知道如何传递这个as as选择器以进一步循环复选框 下面的代码在复选框上循环到,但我不确定如何将选择器传递给

  • 问题内容: 我正在使用Selenium,需要获取控件的ID,但是ID是动态的,我无法获取。 数字1122是动态的,并且其他按钮的开头相同。 问题答案: 我已经多次回答类似的问题,您可能想看看。 ExtJS页面很难测试,尤其是在查找元素时。 以下是一些我认为有用的提示: 永远不要使用动态生成的ID。喜欢 永远不要使用绝对/无意义的XPath,例如 利用有意义的自动生成的部分ID和类名。(因此,在我的

  • 问题内容: 我正在使用spark-sql 2.4.1和Java 8。 如何从给定年份的country_df中动态填充(data_df的)select子句? 即从第一个数据帧,我将获得column的值,这些是我需要从第二个datafame中选择的列。如何才能做到这一点 ? 试过这个 错误: 那么,这里有什么问题,以及如何解决? 问题答案: 您可以尝试以下代码。 从第一个数据集中选择列名称。 在第二个

  • 为什么不能以这种方式获得分配的缓冲区长度。 释放同一数组时 运行时必须知道要解除分配多少。在删除数组之前,是否有任何访问长度的方法。如果没有,为什么没有提供获取长度的API?

  • 我正在寻找一种使用testng和selenium动态获取列值的方法。我有2个表用于显示帐户详细信息,例如帐户id、帐户名称、余额、可用余额。表1是 我想要一个方法,它将接受帐户id作为参数(例如:id2),