Backtracking Problem C-Sharp

Audrey

Grünschnabel
Hallihallo,

wir haben in einer Gruppe vor kurzem unseren ersten Backtracking Algorithmus in C# geschrieben. Leider ist dieser noch nicht ganz ausgereift. Deshalb haben wir einzeln die Aufgabe bekommen, das Programm zum funktionieren zu bringen. Tja, ein paar Fehler hab ich schon ausgemerzt aber nun komme ich überhaupt nicht weiter und ich weiss nicht, wo im Programm die Fehler sind. Das Programm ist ein Sudoku-Prüf-Programm. Wenn es fertig ist, soll man in mehrere Textboxen, Zahlen einfügen und das Programm überprüft dann per Versuch-und-Irrtum solange bis entweder alle Felder ausgefüllt wurden oder es keine Lösung gibt.

Hier ist erstmal der gesamte Code. Als erstes die Programmierung die sich auf den gesamten Ablauf bezieht:


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;
				}
			}
			return false;
		}




		}
	}



Wir haben noch ein paar Kommentare eingebaut, damit müsstet ihr euch mehr oder weniger zurechtfinden :). Der Code für die Zuweisung der einzelnen Textboxen ist ein bisschen lang darum hänge ich ihn hier mal als Datei an...

Falls jemand den (oder die :rolleyes: ) Fehler findet wäre es super wenn ihr mir die mal zeigen könnt. Ich komme auf jedenfall nicht weiter und bin ziemlich ratlos :confused:

lg Audrey
 

Anhänge

  • Form1.zip
    6,2 KB · Aufrufe: 15

Neue Beiträge

Zurück