项目18:简易数独生成器 — 《跟着小王学Python·新手》

《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Python的核心概念。通过开发游戏、构建Web应用、编写网络爬虫、制作桌面软件等多样化项目,学习者可以深入理解并实践Python知识。每周更新1至2篇内容,旨在助力学习者成长为全栈工程师。


文章目录

  • 项目18:简易数独生成器 --- 《跟着小王学Python·新手》
  • 目标
  • 功能
  • 设计
  • 数独规则
  • 算法设计
  • 数据结构
  • 实现步骤
  • 代码实现
  • 测试
  • 注意事项
  • 小结


项目18:简易数独生成器 --- 《跟着小王学Python·新手》_java

目标

本项目旨在为Python新手提供一个简易数独生成器的实现教程。通过本教程,学习者将能够理解数独的规则,掌握基本的算法设计,并学会如何用Python编写一个简易的数独生成器。

功能

  • 生成数独:生成一个9x9的数独棋盘,每个单元格随机填充数字1-9。
  • 检查有效性:确保生成的数独是有效的,即每一行、每一列以及每个3x3的小宫格中数字1-9都只出现一次。

设计

数独规则

数独是一个9x9的网格,被划分为9个3x3的小宫格。玩家需要在空格中填入数字1-9,使得每一行、每一列以及每个小宫格中的数字都不重复。

算法设计

  1. 初始化棋盘:创建一个9x9的二维数组,用于存储数独的数字。
  2. 随机填充数字:随机选择一个空格,并尝试填入1-9中的一个数字。
  3. 检查规则:检查填入的数字是否违反数独规则,如果违反则撤销操作。
  4. 递归填充:重复步骤2和3,直到棋盘填满或无法继续填充。

数据结构

  • 使用二维数组board[9][9]来表示数独棋盘。

实现步骤

  1. 初始化一个9x9的棋盘。
  2. 定义一个函数is_valid(board, row, col, num)来检查在特定位置放置特定数字是否有效。
  3. 定义一个函数solve_sudoku(board)来递归填充棋盘。
  4. 调用solve_sudoku函数生成数独。

代码实现

import random

def is_valid(board, row, col, num):
    # 检查行
    for x in range(9):
        if board[row][x] == num:
            return False
    # 检查列
    for x in range(9):
        if board[x][col] == num:
            return False
    # 检查3x3宫格
    start_row, start_col = 3 * (row // 3), 3 * (col // 3)
    for i in range(3):
        for j in range(3):
            if board[i + start_row][j + start_col] == num:
                return False
    return True

def solve_sudoku(board):
    empty = find_empty_location(board)
    if not empty:
        return True  # 棋盘已填满
    row, col = empty

    for num in range(1, 10):
        if is_valid(board, row, col, num):
            board[row][col] = num

            if solve_sudoku(board):
                return True

            board[row][col] = 0  # 回溯

    return False

def find_empty_location(board):
    for i in range(9):
        for j in range(9):
            if board[i][j] == 0:
                return (i, j)  # 返回空格的位置
    return None

# 初始化棋盘
board = [[0 for _ in range(9)] for _ in range(9)]

# 生成数独
if solve_sudoku(board):
    for row in board:
        print(row)
else:
    print("No solution exists")

测试

  • 运行上述代码,检查输出的数独是否有效。
  • 尝试修改solve_sudoku函数的逻辑,观察输出的变化。

注意事项

  • 确保在调用solve_sudoku函数之前,棋盘已正确初始化。
  • 在实际应用中,可能需要更复杂的算法来生成更有趣的数独,例如考虑难度等级。

小结

通过本项目,我们学习了数独的规则和基本的算法设计。我们通过递归回溯算法实现了一个简易的数独生成器。希望这个项目能够帮助新手理解算法的基本概念,并激发对编程的兴趣。