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