Swift 数独生成器:使用回溯算法随机生成可解数独
@State private var puzzle: [[Int]] = [ [5, 3, 0, 0, 7, 0, 0, 0, 0], [6, 0, 0, 1, 9, 5, 0, 0, 0], [0, 9, 8, 0, 0, 0, 0, 6, 0], [8, 0, 0, 0, 6, 0, 0, 0, 3], [4, 0, 0, 8, 0, 3, 0, 0, 1], [7, 0, 0, 0, 2, 0, 0, 0, 6], [0, 6, 0, 0, 0, 0, 2, 8, 0], [0, 0, 0, 4, 1, 9, 0, 0, 5], [0, 0, 0, 0, 8, 0, 0, 7, 9] ] 随机生成数独内容 且能完成数独内容的内容:要随机生成一个可以完成的数独内容,可以使用回溯算法来解决。回溯算法是一种深度优先搜索的算法,它通过试错的方式来找到所有可能的解。
首先,我们需要定义一个函数来检查某个数字是否可以放置在指定的位置。该函数会检查当前行、当前列和当前九宫格中是否已经存在相同的数字。如果不存在相同的数字,则返回True,否则返回False。
接下来,我们可以使用递归来实现回溯算法。首先,我们需要找到一个空白的位置,即值为0的位置。然后,我们尝试将数字1到9分别放置在该位置上。如果某个数字可以放置在该位置上,则继续递归地找到下一个空白位置。如果在递归过程中发现无法找到合适的数字,则回溯到上一个空白位置,尝试放置下一个数字。
最后,我们可以在主函数中调用回溯算法来生成数独内容。我们可以使用一个循环来随机选择一个位置,并将随机生成的数字放置在该位置上。然后,调用回溯算法来填充剩下的空白位置。
以下是使用Swift实现上述算法的代码:
import Foundation
func isValid(_ puzzle: [[Int]], _ row: Int, _ col: Int, _ num: Int) -> Bool {
  // 检查当前行是否存在相同的数字
  for i in 0..<9 {
    if puzzle[row][i] == num {
      return false
    }
  }
  
  // 检查当前列是否存在相同的数字
  for i in 0..<9 {
    if puzzle[i][col] == num {
      return false
    }
  }
  
  // 检查当前九宫格是否存在相同的数字
  let startRow = (row / 3) * 3
  let startCol = (col / 3) * 3
  for i in startRow..<startRow + 3 {
    for j in startCol..<startCol + 3 {
      if puzzle[i][j] == num {
        return false
      }
    }
  }
  
  return true
}
func solveSudoku(_ puzzle: inout [[Int]]) -> Bool {
  for row in 0..<9 {
    for col in 0..<9 {
      if puzzle[row][col] == 0 {
        for num in 1...9 {
          if isValid(puzzle, row, col, num) {
            puzzle[row][col] = num
            
            if solveSudoku(&puzzle) {
              return true
            }
            
            puzzle[row][col] = 0
          }
        }
        
      return false
    }
  }
  }
  
  return true
}
func generateSudoku() -> [[Int]] {
  var puzzle: [[Int]] = Array(repeating: Array(repeating: 0, count: 9), count: 9)
  
  // 随机选择一个位置,并随机生成数字
  for i in 0..<9 {
    let row = Int.random(in: 0..<9)
    let col = Int.random(in: 0..<9)
    let num = Int.random(in: 1...9)
    
    if isValid(puzzle, row, col, num) {
      puzzle[row][col] = num
    }
  }
  
  // 使用回溯算法填充剩下的空白位置
  solveSudoku(&puzzle)
  
  return puzzle
}
var puzzle = generateSudoku()
for row in puzzle {
  print(row)
}
运行以上代码,将会随机生成一个可以完成的数独内容。
原文地址: https://www.cveoy.top/t/topic/pTwb 著作权归作者所有。请勿转载和采集!