Hallooo,
bin neu hier und mehr oder weniger Anfänger in C#. Habe einen Backtracking-Algorithmus für ein Sudoku-Rätsel geschrieben, allerdings hat er noch "Schönheitsfehler".
Kann mir vll jemand helfen? Hab schon bei vielen Nachgefragt aber bisher noch keine Antwort bekommen. Hier ist erstmal der Code:
Danke schonmaa
lg Aud
bin neu hier und mehr oder weniger Anfänger in C#. Habe einen Backtracking-Algorithmus für ein Sudoku-Rätsel geschrieben, allerdings hat er noch "Schönheitsfehler".
Kann mir vll jemand helfen? Hab schon bei vielen Nachgefragt aber bisher noch keine Antwort bekommen. Hier ist erstmal der Code:
Code:
using System; using System.Windows.Forms; namespace WindowsApplication1 { /// <summary> /// Zusammendfassende Beschreibung für classSudoku. /// </summary> public class classSudoku { public TextBox[,] sudoku = new TextBox[9,9]; public classSudoku() { } //variable zum überprüfen, ob alles fertig ist!! private bool boFinish = false; //prüffunktion!!! public bool passtDieZahl(int x, int y) { bool boCheck = true; if(!checkString(x, y))boCheck = false; if(!checkBox(x, y)) boCheck = false; if(!checkCol(x, y)) boCheck = false; if(!checkRow(x, y)) boCheck = false; if(checkAll()) boFinish = true; return boCheck; } //eingabe auf gültigkeit überprüfen!!! private bool checkString(int x, int y) { bool boString = true; string[] check = {" ","1","2","3","4","5","6","7","8","9"}; for (int i=0; i< check.Length; i++) { if (sudoku[x,y].Text == check[i]) { boString = true; break; } else boString = false; } return boString; } //überprüfe 3x3 feld!!! private bool checkBox(int x, int y) { bool boBox = true; int r=0, c=0; int rows=0, cols=0; if(x >= 0 && x <= 2) r = 0; else if(x >= 3 && x <= 5) r = 3; else if(x >= 6 && x <= 8) r = 6; if(y >= 0 && y <= 2) c = 0; else if(y >= 3 && y <= 5) c = 3; else if(y >= 6 && y <= 8) c = 6; rows=1; cols=c; while(rows != r+3) { while(cols != c+3) { if(r != x && y != c) //überprüfen mit sich selbst verhinden!!! { if(sudoku[x, y].Text == sudoku[r, c].Text) //wenn die zahl in Box existiert!!! { boBox = false; break; } } cols++; } if(!boBox) break; rows++; } return boBox; } //spalte überprüfen!!! private bool checkCol(int x,int y) { bool boCol = true; for(int i=0; i <= 8; i++) { if(i != y) //überprüfen mit sich selbst verhinden!!! { if(sudoku[x, y].Text == sudoku[i, y].Text) //wenn die zahl in spalte existiert!!! { boCol = false; break; } } } return boCol; } //zeile überprüfen!!! private bool checkRow(int x,int y) { bool boRow = true; for(int i=0; i <= 8; i++) { if(i != x) //überprüfen mit sich selbst verhinden!!! { if(sudoku[x, y].Text == sudoku[x, i].Text) //wenn die zahl in zeile existiert!!! { boRow = false; break; } } } return boRow; } //überprüfe gesamtes feld!!! private bool checkAll() { bool boAll = true; for(int i=0; i <= 8; i++) { for(int j=0; j <= 8; j++) { if(sudoku[i,j].Text == " ") { boAll = false; break; } } if(!boAll) break; } return boAll; } private bool findeFreiesFeld(out int i,out int j) { i=0; j=0; // Eine "for"-Schleife, die die Koordinate der X-Achse hochzählt. for(i = 0; i < 9; i++) { for(j = 0; j < 9; j++) { if(sudoku[i,j].Text == " ") { return true; } } } return false; } // Methode "macheZug" wird ausgeführt. public bool macheZug() { int x,y; string[] werte = new string[] {"1","2","3","4","5","6","7","8","9"}; // Die Methode "findeFreiesFeld" wird aufgerufen. if(findeFreiesFeld(out x,out y)) { foreach(string Z in werte) { sudoku[x,y].Text = Z; if(passtDieZahl(x,y) && macheZug()) return true; macheZug(); } } return false; } } }
lg Aud
Comment