Hello!
I got bored and decided to make a simple sudoku solver, but I am having a tiny issue wrapping my head around a simple problem.
Could someone help me get my head around how to find conflicts in the 3x3 square? It's not urgent, simply a project I'm doing for fun
Edit: I've finished most of the code now. It's just that one problem. The change I made was the while loops at the end. I fixed them up:
I got bored and decided to make a simple sudoku solver, but I am having a tiny issue wrapping my head around a simple problem.
puzzle = [["3"," "," ", "8"," ","1", " "," ","2"],
["2"," ","1", " ","3"," ", "6"," ","4"],
[" "," "," ", "2"," ","4", " "," "," "],
["8"," ","9", " "," "," ", "1"," ","6"],
[" ","6"," ", " "," "," ", " ","5"," "],
["7"," ","2", " "," "," ", "4"," ","9"],
[" "," "," ", "5"," ","9", " "," "," "],
["9"," ","4", " ","8"," ", "7"," ","5"],
["6"," "," ", "1"," ","7", " "," ","3"]
]
def isValid():
#This just scans the puzzle to see if it is valid or not by scanning for double ups of numbers in rows or columns
y = 0
while (y < 9):
detectedNumbers = []
x = 0
while(x < 9):
if (puzzle[y][x] != " "):
if (puzzle[y][x] in str(detectedNumbers)):
return False
detectedNumbers.append(puzzle[y][x])
x += 1
y += 1
y = 0
while (y < 9):
detectedNumbers = []
x = 0
while(x < 9):
if (puzzle[x][y] != " "):
if (puzzle[x][y] in str(detectedNumbers)):
return False
detectedNumbers.append(puzzle[x][y])
x += 1
y += 1
return True
def getAllConflictingSquares(x_start,y_start):
result = []
#Get all conflicting horizontal lines
x = 0
while(x < 9):
if (puzzle[y_start][x] != " "):
result.append(puzzle[y_start][x])
x += 1
#Get all conflicting vertical lines
y = 0
while(y < 9):
if (puzzle[y][x_start] != " "):
result.append(puzzle[y][x_start])
y += 1
result.sort()
return list(dict.fromkeys(result))
if (isValid() == False):
print("ERROR: NOT A VALID PUZZLE!")
quit()
#should return "1,2,3,6,7,8,9" missing out "4,5"
print(getAllConflictingSquares(1,0))
#We know we have a valid file. Now actually start solving it!
x_question = 0
y_question = 0
while (y_question < 9):
while(x_question < 9):
possibleSolutions = [1,2,3,4,5,6,7,8,9]
x_question += 1
y_question += 1I know that this isn't the most efficient code, but I just want it to work. This is still a WIP, but the issue I'm facing is in function getAllConflictingSquares(). It can correctly identify all conflicting squares in the x and y axis, but the issue I'm having trouble with is boxes. For those who haven't played sudoku, the idea is that you have to solve the puzzle by finding a number for every single position on the 9x9 board (Numbers 1 through to 9), but where there are no conflicts. A conflict arises where a number appears twice in a row, twice in a column, or twice in a box (3x3 square of positions). It the boxes I'm struggling with. It's not even a hard problem, I've just hit a mental block.Could someone help me get my head around how to find conflicts in the 3x3 square? It's not urgent, simply a project I'm doing for fun
Edit: I've finished most of the code now. It's just that one problem. The change I made was the while loops at the end. I fixed them up:
#We know we have a valid file. Now actually start solving it!
x_question = 0
y_question = 0
while (y_question < 9):
while(x_question < 9):
if (puzzle[y_question][x_question] == " "):
conflict = getAllConflictingSquares(x_question,y_question)
possibleSolutions = list({'1','2','3','4','5','6','7','8','9'} - set(conflict))
if (len(possibleSolutions) == 0):
print("No possible solutions error!")
quit()
elif (len(possibleSolutions) == 1):
print("SOLVED SQUARE")
puzzle[y_question][x_question] = str(possibleSolutions[0])
x_question = -1 #We want x_question to be equal to 0. SO, we set it to -1 so that on the next loop around it adds 1 and sets it to 0.
y_question = 0
x_question += 1
x_question = 0
y_question += 1
print("INCOMPLETE SECTION ERROR: This sudoku contains squares that result in 2 or more solutions after all other squares have been solved. This section of code is NOT complete!")
