python求解数独/幻方

求解“数独”

数独(shù dú):一种数学游戏。玩家根据9×9盘面上的已知数字,推出所有剩余数字,使其满足每行、每列、每一个粗线宫(3*3)内的数字均含1-9,不重复。

可以使用回溯算法来逐步填充数独的空格。
首先,我们需要定义一个函数来检查数独是否有效。这个函数将检查每一行、每一列和每一个3x3的九宫格是否包含重复的数字。
then 定义一个递归函数来填充数独的空格。这个函数将从左上角开始,逐行逐列地填充数字。当遇到一个空格时,我们尝试填充1到9的数字,并递归地调用自身来填充下一个空格。如果无法填充有效的数字,则回溯到上一个空格。

下面是一个完整的Python代码,用于求解数独:

def isValid(board, row, col, num):
    # 检查行是否有效
    for i in range(9):
        if board[row][i] == num:
            return False
    
    # 检查列是否有效
    for i in range(9):
        if board[i][col] == num:
            return False
    
    # 检查3x3九宫格是否有效
    startRow = 3 * (row // 3)
    startCol = 3 * (col // 3)
    for i in range(3):
        for j in range(3):
            if board[startRow + i][startCol + j] == num:
                return False
    
    return True

def solveSudoku(board):
    def backtrack(board, row, col):
        if col == 9:
            return backtrack(board, row + 1, 0)
        if row == 9:
            return True
        
        if board[row][col] != ".":
            return backtrack(board, row, col + 1)
        
        for num in range(1, 10):
            if isValid(board, row, col, str(num)):
                board[row][col] = str(num)
                if backtrack(board, row, col + 1):
                    return True
                board[row][col] = "."
        
        return False
    
    backtrack(board, 0, 0)

def printSudoku(board):
    for i in range(9):
        for j in range(9):
            print(board[i][j], end=" ")
        print()

board = [
    ["5", "3", ".", ".", "7", ".", ".", ".", "."],
    ["6", ".", ".", "1", "9", "5", ".", ".", "."],
    [".", "9", "8", ".", ".", ".", ".", "6", "."],
    ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
    ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
    ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
    [".", "6", ".", ".", ".", ".", "2", "8", "."],
    [".", ".", ".", "4", "1", "9", ".", ".", "5"],
    [".", ".", ".", ".", "8", ".", ".", "7", "9"]
]

solveSudoku(board)
printSudoku(board)

在这里插入图片描述

求解“幻方”

幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。

下面是一个完整的Python代码,用于求解幻方:

def magicSquare(n):
    magicSquare = [[0 for x in range(n)]
                   for y in range(n)]
    i = n // 2
    j = n - 1
    num = 1
    while num <= (n * n):
        if i == -1 and j == n:
            j = n - 2
            i = 0
        else:
            if j == n:
                j = 0
            if i < 0:
                i = n - 1
        if magicSquare[i][j] != 0:
            j = j - 2
            i = i + 1
            continue
        else:
            magicSquare[i][j] = num
            num = num + 1
        j = j + 1
        i = i - 1
    print("Magic square for n =", n)
    print("Sum of each row or column", n * (n * n + 1) / 2, "\n")
    for i in range(0, n):
        for j in range(0, n):
            print('{:2d}'.format(magicSquare[i][j]), end=" ")
        print()

n = int(input("Enter the value of n (odd): "))
magicSquare(n)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python求解数独(Sudoku)通常会使用回溯算法或启发式搜索策略。以下是一个简单的概述: 1. **回溯算法**:这是一种递归的方法,从第一个空格开始,尝试填入数字1到9,然后检查每一行、每一列和每一个宫格(3x3的小九宫格)是否都包含这9个数字一次。如果发现冲突,则回溯到上一步,尝试下一个数字。这个过程一直持续到找到一个合法的数独决方案或者所有可能的数字都尝试过仍无。 2. **启发式搜索**:如使用A*搜索,会优先填充那些规则更明确的位置(如行、列、宫格已完全填满的区域),并在搜索过程中维护一个启发式函数(如最小剩余数法),帮助找到最快接近决方案的状态。 在Python中,可以使用`numpy`库来创建和操作二维数组,`pandas`处理数据结构,还有自定义的数据结构(如`dict`或`set`)来存储候选数字。下面是一个简单的回溯算法示例: ```python import numpy as np def solve_sudoku(board): empty_cells = find_empty_cells(board) if not empty_cells: return True # 决了,返回True row, col = empty_cells for num in range(1, 10): if is_safe(board, row, col, num): board[row][col] = num if solve_sudoku(board): return True board[row][col] = 0 # 回溯:移除刚才填入的数 return False # 辅助函数 def find_empty_cells(board): for i in range(9): for j in range(9): if board[i][j] == 0: return (i, j) # 返回第一个空格的坐标 return None def is_safe(board, row, col, num): # 检查行、列、宫格 return all(board[row, j] != num for j in range(9)) and \ all(board[i, col] != num for i in range(row, row + 3, 3)) and \ all(board[i, j] != num for j in range(col, col + 3, 3)) # 示例: board = np.array([[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]]) if solve_sudoku(board): print("Solution:") print(board) else: print("No solution exists.") ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值