Implement the constraints satisfaction problem which can solve Odd/Even/Prime Sudoku puzzle. You have to define the constrains, find domains, variables and non empty domain of possible values of each variable. After defining constrain use backtracking algorithm to solve the puzzle. Please read following instruction carefully for the development of program.
To solve the puzzle, player has to fill 9x9 grids with single digit
numbers (1 to 9). Out of 81 cells 9 cells are green color cells and their
position is fixed. Remaining 72 cells are either gray or white colored. Gray
and white colors are randomly allocated to the cells at the beginning of the
game. Within the rows and columns are 9 “squares” (made up of 3 x 3 spaces).
Each 3x3 space must have one green color cell at the center. Each row, column
and square (9 spaces each) needs to be filled out without repeating any numbers
within the row, column or square. Green colored cells must be filled with prime
numbers (2, 3, 5, and 7). Gray color cells must be filled with odd numbers
(1,3,5,7,9) and white color cell must be filled with even number(2,4,6,8). At
the beginning of the game 25% random location must be filled with numbers.
Solution
# A Utility Function to print the Grid
def print_grid(self, arr):
for i in range(9):
for j in range(9):
print(arr[i][j],end=' ')
print('n')
# Function to Find the entry in the Grid that is still not used
# Searches the grid to find an entry that is still unassigned. If
# found, the reference parameters row, col will be set the location
# that is unassigned, and true is returned. If no unassigned entries
# remains, false is returned.
# 'l' is a list variable that has been passed from the solve_sudoku function
# to keep track of incrementation of Rows and Columns
def find_empty_location(self, arr, l):
for row in range(9):
for col in range(9):
if(arr[row][col]== 0):
l[0]= row
l[1]= col
return True
return False
# Returns a boolean which indicates whether any assigned entry
# in the specified row matches the given number.
def used_in_row(self, arr, row, num):
for i in range(9):
if(arr[row][i] == num):
return True
return False
# Returns a boolean which indicates whether any assigned entry
# in the specified column matches the given number.
def used_in_col(self, arr, col, num):
for i in range(9):
if(arr[i][col] == num):
return True
return False
# Returns a boolean which indicates whether any assigned entry
# within the specified 3x3 box matches the given number
def used_in_box(self, arr, row, col, num):
for i in range(3):
for j in range(3):
if(arr[i + row][j + col] == num):
return True
return False
# Checks whether it will be legal to assign num to the given row, col
# Returns a boolean which indicates whether it will be legal to assign
# num to the given row, col location.
def check_location_is_safe(self, arr, row, col, num):
# Check if 'num' is not already placed in current row,
# current column and current 3x3 box
return not soduku_solver.used_in_row(self,arr, row, num) and not soduku_solver.used_in_col(self,arr, col, num) and not soduku_solver.used_in_box(self,arr, row - row % 3, col - col % 3, num)
# Takes a partially filled-in grid and attempts to assign values to
# all unassigned locations in such a way to meet the requirements
# for Sudoku solution (non-duplication across rows, columns, and boxes)
def solve_sudoku(self,arr):
# 'l' is a list variable that keeps the record of row and col in find_empty_location Function
l =[0, 0]
# If there is no unassigned location, we are done
if(not soduku_solver.find_empty_location(self,arr, l)):
return True
# Assigning list values to row and col that we got from the above Function
row = l[0]
col = l[1]
# consider digits 1 to 9
for num in range(1, 10):
# if looks promising
if(soduku_solver.check_location_is_safe(self,arr, row, col, num)):
# make tentative assignment
arr[row][col]= num
if(self.solve_sudoku(arr)):
return True
# failure, unmake & try again
arr[row][col] = 0
# this triggers backtracking
return False
# Driver main function to test above functions
if __name__=="__main__":
# creating a 2D array for the grid
grid =[[0 for x in range(9)]for y in range(9)]
# assigning values to the grid
grid =[[3, 0, 6, 5, 0, 8, 4, 0, 0],
[5, 2, 0, 0, 0, 0, 0, 0, 0],
[0, 8, 7, 0, 0, 0, 0, 3, 1],
[0, 0, 3, 0, 1, 0, 0, 8, 0],
[9, 0, 0, 8, 6, 3, 0, 0, 5],
[0, 5, 0, 0, 9, 0, 6, 0, 0],
[1, 3, 0, 0, 0, 0, 2, 5, 0],
[0, 0, 0, 0, 0, 0, 0, 7, 4],
[0, 0, 5, 2, 0, 6, 3, 0, 0]]
# if success print the grid
solver=soduku_solver()
if(solver.solve_sudoku(grid)):
solver. print_grid(grid)
else:
print("No solution exists")
No comments:
Post a Comment