求解“数独”
数独(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)