Code archives/Algorithms/Sudoku-Solver
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
in German | |||||
Graphics 800,600,16,2 ;---------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------ARRAYS--VARIABLES------------------------------------------------------------------; ;---------------------------------------------------------------------------------------------------------------------------------; Dim Array_all(9,9,2) ;------------------------------------- For y=1 To 9 For x=1 To 9 Read Array_all(x,y,2) Next Next ;-------------------------------------- Dim Array_x (9,9) Dim Array_y (9,9) Dim Array_b (9,9) Global Var_F,Var_read_In,Eing$="nicht" Global Var_F_x,Var_F_y,Var_F_b ;---------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------MAIN-------------------------------------------------------------------------------; ;---------------------------------------------------------------------------------------------------------------------------------; .label_anf Print "Per Input einlesen [1]" Print "Per .txt-Datei einlesen [2]" Print "Reihen-Array ausgeben [3]" Print "Spalten-Array ausgeben [4]" Print "Kästchen-Array ausgeben [5]" Print "Sudoku ausgeben [6]" Print "Sudoku lösen [7] Print "Beenden [8]" Print Print "Sudoku "+Eing+" vorhanden !" Print temp=WaitKey() If temp =49 Then Print "Per Input einlesen !":func_read_in_input():func_into_arrays() If temp =50 Then Print "Per .txt-Datei einlesen !":func_read_in_datei():func_into_arrays() If temp =51 Then Print "Reihen-Array ausgeben !":func_show_Array_x() If temp =52 Then Print "Spalten-Array ausgeben !":func_show_Array_y() If temp =53 Then Print "Kästchen-Array ausgeben !":func_show_Array_b() If temp =54 Then Print "Sudoku ausgeben !":func_show_Array_all() If temp =55 Then Print "Sudoku lösen !":func_solve_sudoku() If temp =56 Then End Print "-------------------------------------------------------------------------------------" Print "-------------------------------------------------------------------------------------" Print "-------------------------------------------------------------------------------------" Goto label_anf WaitKey End ;----------------------------------------------------------------------------------------------------------------------------------; ;-----------------------------------------------FUNCTIONS--------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_read_in_input() Print For y=1 To 9 For x=1 To 9 .label_false temp=Input("Wert des Feldes "+x+"/"+y+" : ") If temp<0 Or temp>9 Goto label_false Array_all(x,y,1)=temp Var_read_in=True Next Next Eing="" End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_read_in_datei() Print dat$=Input("Welche Datei ? ") a=ReadFile(dat$) If a=0 Then Print "Datei existiert nicht !" Goto label_func2_end EndIf For y=1 To 9 l$=ReadLine(a) For x=1 To 9 temp$=Mid$(l$,x,1) temp=Int(temp$) If temp<0 Or temp>9 Then Print "Fehler: Ziffer <0 oder >9 !" Goto label_func2_end EndIf Array_all(x,y,1)=temp Var_read_in=True Next Next Print Print "Datei eingelesen" Print Eing="" .label_func2_end End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_into_arrays() ;---Arrayinhalte-löschen-- ;-Array_x()- For y=1 To 9 For z=1 To 9 Array_x(y,z)=False Next Next ;-Array_y()- For x=1 To 9 For z=1 To 9 Array_y(x,z)=False Next Next ;-Array_b()- For b=1 To 9 For z=1 To 9 Array_b(b,z)=False Next Next ;---Array_x()------------- For y=1 To 9 For x=1 To 9 If Array_x(y,Array_all(x,y,1))<>True And Array_all(x,y,1)<>0 Then Array_x(y,Array_all(x,y,1))=True ElseIf Array_x(y,Array_all(x,y,1))=True And Array_all(x,y,1) Then Print "Fehler in Reihe "+y+" durch die Zahl "+Array_all(x,y,1)+" !" Var_F=Var_F+1 EndIf Next Next ;---Array_y()------------- For x=1 To 9 For y=1 To 9 If Array_y(x,Array_all(x,y,1))<>True And Array_all(x,y,1)<>0 Then Array_y(x,Array_all(x,y,1))=True ElseIf Array_y(x,Array_all(x,y,1))=True And Array_all(x,y,1) Then Print "Fehler in Spalte "+x+" durch die Zahl "+Array_all(x,y,1)+" !" Var_F=Var_F+1 EndIf Next Next ;---Array_b()------------- For y=1 To 9 For x=1 To 9 b=Array_All(x,y,2) If Array_b(b,Array_all(x,y,1))<>True And Array_all(x,y,1)<>False Then Array_b(b,Array_all(x,y,1))=True ElseIf Array_b(b,Array_all(x,y,1))=True And Array_all(x,y,1)<>0 Then Print "Fehler im Kästchen "+b+" durch die Zahl "+Array_all(x,y,1)+" !" Var_F=Var_F+1 EndIf Next Next End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_show_Array_x() For y=1 To 9 Print For z=1 To 9 Write y+"/"+z+": "+Array_x(y,z)+" | " Next Next Print End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_show_Array_y() For x=1 To 9 Print For z=1 To 9 Write x+"/"+z+": "+Array_y(x,z)+" | " Next Next Print End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_show_Array_b() For k=1 To 9 Print For z=1 To 9 Write k+"/"+z+": "+Array_b(k,z)+" | " Next Next Print End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_show_array_all() For y=1 To 9 Print If y=4 Or y=7 Then Print " +++ +++ +++ +++ +++ +++ +++ +++ +++ " Else Print " --- --- --- --- --- --- --- --- --- " EndIf Write "| " For x=1 To 9 If Array_all(x,y,1) Then If x=3 Or x=6 Then Write Array_all(x,y,1)+" + " Else Write Array_all(x,y,1)+" | " EndIf Else If x<>3 And x<>6 Then Write " | " Else Write " + " EndIf EndIf Next Next Print Print " --- --- --- --- --- --- --- --- --- " End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_solve_sudoku() .anf_func8 For y=1 To 9 For x=1 To 9 If Array_All(x,y,1)=0 Then m=func_count_m(x,y) If m<>1 Then m=0 Else m=0 For Z=1 To 9 If Array_x(y,z)=False And Array_y(x,z)=False And Array_b(Array_All(x,y,2),z)= False Then Exit EndIf Next Array_All(x,y,1)=Z func_into_arrays() Goto anf_func8 EndIf EndIf Next Next Print Print "Gelöst !" Print End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Function func_Count_m(x,y) m=0 For Z=1 To 9 If Array_x(y,z)=False And Array_y(x,z)=False And Array_b(Array_All(x,y,2),z)= False Then m=m+1 EndIf Next Return m End Function ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; ;----------------------------------------------------------------------------------------------------------------------------------; Data 1,1,1,2,2,2,3,3,3 Data 1,1,1,2,2,2,3,3,3 Data 1,1,1,2,2,2,3,3,3 Data 4,4,4,5,5,5,6,6,6 Data 4,4,4,5,5,5,6,6,6 Data 4,4,4,5,5,5,6,6,6 Data 7,7,7,8,8,8,9,9,9 Data 7,7,7,8,8,8,9,9,9 Data 7,7,7,8,8,8,9,9,9 |
Comments
None.
Code Archives Forum