随机数独生成

关于数独的介绍

数独的规则

数独生成的规则为:根据9X9表盘上面的已知数字,推理出所有剩余空格的数字,并且需满足每一行、每一列、每个九宫格内的数字均含1-9,不重复。

本次实验的介绍

实验目的

输出不同难度的数独题目和答案

设计思路

①采用随机填数的方法生成数独初始盘
②采用深度优先求解数独
③采用挖洞法对求解出的数独进行挖洞
④再次采用深度优先对数独进行求解

算法设计

导入所需库

import numpy as np
import random

导入Numpy库,使用矩阵来保存和处理数独数据。使用zeros方法生成9X9的的0矩阵,初始化数独。导入Random库的randint方法来生成随机的行标和列标用来随机定位一个单元格。

初始化九宫格

class Sudoku:
    def __init__(self):
        # 初始化九宫格
        self.grids= np.zeros((9, 9), dtype=int, order='C')
        self.possibleNums= {
   1, 2, 3, 4, 5, 6, 7, 8, 9}
        # 用于挖洞时保存挖好的数独
        self.uniqueGrids = None

定义约束条件

# 由三个约束条件剔除数据
    def get_possible(self, row, col):
        bRow, bCol = row // 3, col // 3
        # 提取行标为row的行
        rowSet = set(self.grids[row])
        # 提取列标为col的列
        colSet = set(self.grids[:,col])
        # 由行标列表取出所在的3*3小九宫格
        blockSet = set(self.grids[bRow * 3: bRow * 3 + 3,
                       bCol * 3: bCol * 3 + 3].reshape(9))
        # 从possible中剔除所在行、所在列和所在小九宫格里的相同的数字
        return self.possibleNums - rowSet - colSet - blockSet

深度优先方法解数独

    def dfs(self):
        for row in range(9):
            for col in range(9):
                # 从00列开始寻找空白格
                if self.grids[row, col] == 0:
                    # 用get_possible得到当前空白格可以填入的数值
                    possible = self.get_possible(row, col)
                    # 深度优先,填入第一个值,递归填入剩下空白格的值
                    # 如果无法正确填写,就还回归上一个刚填的格,置0后重新填入possible里第二值
                    # 直到所有空白格都正确填入
                    for value in possible:
                        self.grids[row, col] = value
                        if self.dfs():
                            return True
                        self.grids[row, col] = 0
                    return False
        return True

拉斯维加斯算法生成数独

 def lasVegas(self, initGivenCount):
        # initGivenCount为初始给定数字的个数
        while initGivenCount:
            # 用随机行列定位一个单元格
            row = random.randint(0, 8)
            col = random.randint(0, 8)
            # 选中空白格,且避免再次选中已经填入的单元格
            if self.grids[row, col] == 0:
                # 随机在可能的取值中取一个数,避免初始的宫格中都是1,2,
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Java 中随机生成数独,可以按照以下步骤进行: 1. 创建一个 9x9 的二维数组,用于表示数独的初始状态。 2. 随机选择某些格子,并将其填上一个 1~9 的随机数。 3. 使用递归回溯算法,对已经填好的格子进行检查,生成符合数独规则的数独。 4. 将数独的初始状态中一些格子的数字清空,得到最终的随机数独。 下面是一个简单的 Java 代码示例,可以生成一个随机的数独: ```java import java.util.*; public class SudokuGenerator { private static final int SIZE = 9; private static final int EMPTY = 0; private int[][] board; public SudokuGenerator() { board = new int[SIZE][SIZE]; } public void generate() { // 随机填一些格子 Random random = new Random(); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (random.nextInt(4) == 0) { board[i][j] = random.nextInt(9) + 1; } } } // 生成符合规则的数独 generateSudoku(0, 0); // 清空一些格子,得到最终的随机数独 int emptyCount = random.nextInt(21) + 30; for (int i = 0; i < emptyCount; i++) { int row = random.nextInt(SIZE); int col = random.nextInt(SIZE); if (board[row][col] != EMPTY) { board[row][col] = EMPTY; } } } private boolean generateSudoku(int row, int col) { if (col == SIZE) { col = 0; row++; if (row == SIZE) { return true; } } if (board[row][col] != EMPTY) { return generateSudoku(row, col + 1); } List<Integer> numbers = new ArrayList<>(); for (int i = 1; i <= SIZE; i++) { numbers.add(i); } Collections.shuffle(numbers); for (int number : numbers) { if (isValid(row, col, number)) { board[row][col] = number; if (generateSudoku(row, col + 1)) { return true; } board[row][col] = EMPTY; } } return false; } private boolean isValid(int row, int col, int number) { for (int i = 0; i < SIZE; i++) { if (board[row][i] == number || board[i][col] == number) { return false; } } int boxRow = row - row % 3; int boxCol = col - col % 3; for (int i = boxRow; i < boxRow + 3; i++) { for (int j = boxCol; j < boxCol + 3; j++) { if (board[i][j] == number) { return false; } } } return true; } public void print() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { System.out.print(board[i][j] + " "); } System.out.println(); } } public static void main(String[] args) { SudokuGenerator generator = new SudokuGenerator(); generator.generate(); generator.print(); } } ``` 该代码使用了递归回溯算法生成符合数独规则的数独。在生成过程中,会随机填一些格子,并将一些格子清空,得到最终的随机数独。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值