import copy print("SUDOKU SOLVER") print("ENTER Sudoku line by line.") print("Each line must have 9 numbers divided by whitespaces.") print("For empty cells use 0 (zero)") """ sudoku_arr_in = [] for i in range(0,9): while True: #print("line #",i, ": ", end="") s = "line #"+str(i)+ ": " line = raw_input(s) print( line) try: num_line = [int(s) for s in line.split(" ")] except: continue if(len(num_line)==9): sudoku_arr_in.append(num_line) break """ sudoku_arr_in = [[3,0,0,6,0,0,0,0,0], [0,0,0,0,1,0,0,4,0], [0,0,0,0,0,0,0,2,0], [0,2,0,0,0,0,0,8,0], [0,0,0,5,0,0,7,0,0], [0,0,8,3,0,0,0,0,0], [1,4,0,0,2,0,0,0,0], [5,0,0,0,0,0,6,0,0], [0,0,0,0,0,0,3,0,0]]#MINIMAL ## [[0,0,1,0,0,0,4,6,0], ## [9,0,0,0,5,7,0,0,0], ## [2,0,0,1,0,0,0,0,7], ## [0,2,0,8,0,3,6,0,0], ## [0,4,0,0,9,0,0,3,0], ## [0,0,3,7,0,4,0,5,0], ## [1,0,0,0,0,8,0,0,5], ## [0,0,0,5,3,0,0,0,2], ## [0,8,5,0,0,0,9,0,0]]#HARD ##EASY ## [[0, 6, 0, 0, 0, 5, 0, 7, 0], ## [1,4,0,7,0,3,9,0,0], ## [0,0,7,8,0,0,5,4,0], ## [0,0,6,0,7,9,0,0,5], ## [3,5,0,0,0,0,0,1,7], ## [7,0,0,5,3,0,2,0,0], ## [0,2,8,0,0,6,7,0,0], ## [0,0,3,4,0,1,0,9,2], ## [0,9,0,2,0,0,0,8,0]] sudoku_arr = copy.deepcopy(sudoku_arr_in) def get_flat_sub_square_for(i,j): start_i = int(i/3)*3 start_j = int(j/3)*3 sub_square = [l[start_j:start_j+3] for l in sudoku_arr[start_i:start_i+3]] return [val for sublist in sub_square for val in sublist] def get_column_for(c): return [line[c] for line in sudoku_arr] def get_possibilities_for_line(dict_list,l): return [p for p in dict_list if p["line"]==l] def get_possibilities_for_col(dict_list,l): return [p for p in dict_list if p["col"]==l] def get_possibilities_for_sub_square(dict_list,p0): p0_square_no = get_sub_square_no(p0["line"],p0["col"]) return [p for p in dict_list if get_sub_square_no(p["line"],p["col"])==p0_square_no] def check_is_it_only_one_possibility(dict_list, a): count_a = 0; for d in dict_list: count_a += d["poss_list"].count(a) return count_a==1 def check_is_it_only_one_possibility_at_all(a): count_a = 0; for line in sudoku_arr: count_a += line.count(a) return count_a==8 def get_sub_square_no(x,y): return int(x/3)*3+int(y/3) #create and fill list of possibilities possibilities = [] for i in range(0,9): for j in range(0,9): if(sudoku_arr[i][j]==0): possibilities.append({"line":i, "col":j, "poss_list":[x for x in range(1,10)]}) #do search iterations_without_changes=0 total_changes = 0 total_iterations = 0 print("total possibilities left:", len(possibilities)) while possibilities:# and iterations_without_changes<1000: total_iterations += 1 for p in possibilities: #check is it only one possibility here if (len(p["poss_list"])==1): #print("appling changes at ", p["line"], p["col"]) sudoku_arr[p["line"]][p["col"]]=p["poss_list"][0] possibilities.remove(p) iterations_without_changes=0 total_changes+=1 else: change_applied=False for x in p["poss_list"]: if(check_is_it_only_one_possibility_at_all(x) or check_is_it_only_one_possibility(get_possibilities_for_line(possibilities,p["line"]),x) or check_is_it_only_one_possibility(get_possibilities_for_col(possibilities,p["col"]),x) or check_is_it_only_one_possibility(get_possibilities_for_sub_square(possibilities,p),x)): #print("appling changes at ", p["line"], p["col"]) sudoku_arr[p["line"]][p["col"]]=x #print("p:",p) possibilities.remove(p) iterations_without_changes=0 total_changes+=1 change_applied=True break if(change_applied): continue #modify list of possibilities: iterations_without_changes+=1 #remove numbers in line for x in sudoku_arr[p["line"]]: if(x!=0) and (x in p["poss_list"]): p["poss_list"].remove(x) #remove numbers in column for x in get_column_for(p["col"]): if(x!=0)and (x in p["poss_list"]): p["poss_list"].remove(x) #remove numbers in sub-square for x in get_flat_sub_square_for(p["line"], p["col"]): if(x!=0)and (x in p["poss_list"]): p["poss_list"].remove(x) print("sudoku state:",sudoku_arr) """ print("possibilities left:", possibilities) print("total possibilities left:", len(possibilities)) print("total changes:",total_changes) print("total_iterations:",total_iterations) print("iterations_without_changes:", iterations_without_changes) """
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question