35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
"""
|
|
Implementiere einen Hill-Climbing-Algorithmus, der die Zahlen in
|
|
einem SUDOKU-Feld durch vertauschen innerhalb einer Zeile so
|
|
umsortiert, dass sie die SUDOKU-Bedingung auch für die Spalten
|
|
erfüllen.
|
|
"""
|
|
|
|
import numpy as np
|
|
|
|
board = np.array([
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
])
|
|
|
|
board_size = len(board) # Board is always quadratic
|
|
|
|
while -np.sum([len(set(board[:, i])) != 9 for i in range(9)]):
|
|
for row in range(board_size):
|
|
for col in range(board_size):
|
|
# Create array of column values excluding current row
|
|
column_without_current = np.concatenate([board[:row, col], board[row + 1:, col]])
|
|
if board[row, col] in column_without_current:
|
|
board[row, col], board[row, (col + 1) % board_size] = board[row, (col + 1) % board_size], board[row, col]
|
|
break
|
|
# print(-np.sum([len(set(board[:, i])) != 9 for i in range(9)])) # debugging
|
|
|
|
print(board)
|