Announcement

Collapse
No announcement yet.

Backtracking-Algorithmus

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Backtracking-Algorithmus

    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:

    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;
    		}
    
    		}
    	}
    Danke schonmaa

    lg Aud

  • #2
    Hab schon bei vielen Nachgefragt aber bisher noch keine Antwort bekommen.
    Kein Wunder.......legst den Code hier rein, sagst er hat noch Fehler und das wars. Wer glaubst du will sich da jetzt ohne jeden Hinweis reinarbeiten? Nichtmal wo der Fehler ist teilst du mit...
    Christian

    Comment


    • #3
      Das ist es ja... Ich finde den Fehler einfach nicht... er startet das Programm und anschliessend passiert längere Zeit nichts mehr...

      Comment


      • #4
        Debugge das Programm ggf. unter setzen von Breakpoints
        Christian

        Comment


        • #5
          User ist Crossposter.

          Comment


          • #6
            Sorry das ich mich da einmische, aber

            1.
            "Schönheitsfehler"
            würde ich das nicht nennen, da das Programm mit sicherheit nicht läuft


            2.
            Ich finde den Fehler einfach nicht
            Das sind ein paar mehr Fehler, die was mit logischem Denken zu tun haben


            3.
            Find ichs gut, dass noch keiner geholfen hat, denn das Fehlerfinden war unsere Hausaufgabe gewesen, und da könnten wir ja alle herkommen, unseren kompletten Code einfügen und sagen, macht mal bitte, und dann dafür noch eine gute Note einstreichen!!



            4.
            Wer nach fast einem Jahr Ausbildung seinen Code nicht debuggen kann, und nicht einen einzigen Fehler findet, hat wahrscheinlich seinen Beruf verfehlt...

            LG an IN07

            Comment

            Working...
            X