<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Backtracking Algorithmus. (Zu) kompliziert?]]></title><description><![CDATA[<p>Hallo, ich habe an einem Backtracking Algorithmus für Sudokus geschrieben (wie es in einem Thread zuvor schon einmal versucht wurde).<br />
Mein Algorithmus löst leere Sudokus und Sudokus, bei denen nur wenige Zahlen vorgegeben sind. Sind aber mehrere Zahlen vorgegeben, wie z.B bei</p>
<pre><code>0 3 0 | 0 0 0 | 0 0 0
0 0 0 | 1 9 5 | 0 0 0
0 9 8 | 0 0 0 | 0 6 0
------+-------+------
8 0 0 | 0 0 0 | 0 0 0
0 0 0 | 0 0 0 | 0 0 0
0 0 0 | 0 0 0 | 0 0 0
------+-------+------
0 0 0 | 0 0 0 | 0 0 0
0 0 0 | 0 0 0 | 0 0 0
0 0 0 | 0 0 0 | 0 0 0
</code></pre>
<p>hängt sich mein Programm ab einem Punkt auf.</p>
<p>Vorab ein paar Infos zum Programm:<br />
pruefen() gibt &quot;true&quot; zurück, wenn das Sudoku gültig ist und &quot;false&quot;, wenn es halt nicht gültig ist.<br />
In <strong>int arr[9][9]</strong> sind die Zahlen des sudokus gespeichert (0 = leeres Feld) und bei <strong>bool start[9][9]</strong> haben die Felder den Wert true, die von Anfang an belegt waren.</p>
<p>Hier meine backtracking Funktion:</p>
<pre><code class="language-cpp">bool backtracking()
{
    int sum=0;
    int xc=0,yc=0;
    bool control=false;

    for(;;)
    {
        for(int y=yc; y!=9; ++y)           //bewegung nach unten
        {
            for(int x=xc; x!=9; ++x)       //bewegung nach rechts
            {
                xc=0;yc=0;                 //siehe unten

                sum=0;                      //
                for(int o=0;o!=9;++o)       // Abbruchbedingung:
                {                           // Wenn die Werte aller
                    for(int p=0;p!=9;++p)   // Felder addiert
                    {                       // 405 ergeben
                        sum+=arr[p][o];     // (also 9*8 + 9*7 ...)
                    }                       // dann ist das Sudoku
                }                           // fertig und die Funtkion
                if(sum==405)                // gibt true zurück
                    return true;            //

                control=false; //control zurücksetzen

                if(arr[x][y]!=0) //wenn feld schon vorgegeben ist, nächstes Feld bearbeiten
                    continue;

                for(int a=1;a!=10;++a)           // systematisch alle Zahlen
                {                                // von 1 bis 9 in das leere
                    arr[x][y]=a;                 // Feld einsetzen. Wenn das
                                                 // Sudoku noch gültig ist, wird
                    if(pruefen())                // control auf true gesetzt,
                    {                            // die schleife verlassen und
                        control = true;          // mit dem nächsten feld weiter gemacht.
                        break;                   // wenn keine zahl von 1 bis 9 zu einem
                    }                            // gültigen Sudoku führt, bleibt control
                }                                // auf false und der eigentliche backtracking
                                                 // algorithmus setzt ein

                if(! control)                    // dieser block wird ausgeführt, wenn keine
                {                                // zahl für das feld arr[x][y] zu einem gültigen Sudoku führt
                    arr[x][y]=0;                 // das Feld arr[x][y] wird daher auf 0 gesetzt

                    for(;;)                      // diese for-Schleife sucht nach einem Feld, das VOR
                    {                            // dem Feld arr[x][y] liegt und nich von Anfang an belegt ist

                        --x;                     // x Koordinate um eins verkleinern (also ein Feld zurück gehen)
                        if(x&lt;0){x=8;--y;}        // falls das ende der zeile erreicht ist, eine zeile weiter oben suchen

                        if(start[x][y]==false)   // wenn das so ermittelte Feld nicht von Anfang an belegt ist,
                        {                        // .
                            xc=x; // siehe       // .
                            yc=y; // unten       // .
                            ++arr[x][y];         // wird sein Wert um 1 erhöht
                            if(arr[x][y]==10)    // Sollte in dem Feld nun eine 10 stehen (was ja ungültig ist)
                            {                    // wird es auf 0 zurück gesetzt. die Schleife beginnt von neuem
                                arr[x][y]=0;     // und sucht das nächste editierbare Feld

                                if(x==0 &amp;&amp; y==0) // falls das feld[0][0] auf 10 gesetzt wird
                                    return false;// wurden ALLE möglichen Kombinationen für das Sudoku ausprobiert.
                            }                    // das sudoku ist damit unlösbar

                            if(arr[x][y]!=0)     // wenn ++arr[x][y] einen gültigen Wert ergibt
                                break;           // werden ALLE schleifen - bis auf die große
                        }                        // Endlosschleife - verlassen.
                    }                            // Die Koordinaten des Feldes arr[x][y] wurden
                }                                // in den Variablen xc und yc gespeichert.
                if(!control)                     // Dies führt dazu, dass die Schleifen, die die
                    break;                       // x- und y-koordinate ändern, NACH dem Feld beginnen,
            }                                    // dessen Wert zuvor um 1 erhöht wurde
            if(!control)                         // .
                break;                           // .
        }                                        // .
    }
    return true;
}
</code></pre>
<p>Wo liegt mein Denkfehler?</p>
<p>Bin über alle Tipps froh!</p>
<p>Mfg Greedy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/232696/backtracking-algorithmus-zu-kompliziert</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 05:07:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232696.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Jan 2009 23:55:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Backtracking Algorithmus. (Zu) kompliziert? on Sun, 25 Jan 2009 23:55:50 GMT]]></title><description><![CDATA[<p>Hallo, ich habe an einem Backtracking Algorithmus für Sudokus geschrieben (wie es in einem Thread zuvor schon einmal versucht wurde).<br />
Mein Algorithmus löst leere Sudokus und Sudokus, bei denen nur wenige Zahlen vorgegeben sind. Sind aber mehrere Zahlen vorgegeben, wie z.B bei</p>
<pre><code>0 3 0 | 0 0 0 | 0 0 0
0 0 0 | 1 9 5 | 0 0 0
0 9 8 | 0 0 0 | 0 6 0
------+-------+------
8 0 0 | 0 0 0 | 0 0 0
0 0 0 | 0 0 0 | 0 0 0
0 0 0 | 0 0 0 | 0 0 0
------+-------+------
0 0 0 | 0 0 0 | 0 0 0
0 0 0 | 0 0 0 | 0 0 0
0 0 0 | 0 0 0 | 0 0 0
</code></pre>
<p>hängt sich mein Programm ab einem Punkt auf.</p>
<p>Vorab ein paar Infos zum Programm:<br />
pruefen() gibt &quot;true&quot; zurück, wenn das Sudoku gültig ist und &quot;false&quot;, wenn es halt nicht gültig ist.<br />
In <strong>int arr[9][9]</strong> sind die Zahlen des sudokus gespeichert (0 = leeres Feld) und bei <strong>bool start[9][9]</strong> haben die Felder den Wert true, die von Anfang an belegt waren.</p>
<p>Hier meine backtracking Funktion:</p>
<pre><code class="language-cpp">bool backtracking()
{
    int sum=0;
    int xc=0,yc=0;
    bool control=false;

    for(;;)
    {
        for(int y=yc; y!=9; ++y)           //bewegung nach unten
        {
            for(int x=xc; x!=9; ++x)       //bewegung nach rechts
            {
                xc=0;yc=0;                 //siehe unten

                sum=0;                      //
                for(int o=0;o!=9;++o)       // Abbruchbedingung:
                {                           // Wenn die Werte aller
                    for(int p=0;p!=9;++p)   // Felder addiert
                    {                       // 405 ergeben
                        sum+=arr[p][o];     // (also 9*8 + 9*7 ...)
                    }                       // dann ist das Sudoku
                }                           // fertig und die Funtkion
                if(sum==405)                // gibt true zurück
                    return true;            //

                control=false; //control zurücksetzen

                if(arr[x][y]!=0) //wenn feld schon vorgegeben ist, nächstes Feld bearbeiten
                    continue;

                for(int a=1;a!=10;++a)           // systematisch alle Zahlen
                {                                // von 1 bis 9 in das leere
                    arr[x][y]=a;                 // Feld einsetzen. Wenn das
                                                 // Sudoku noch gültig ist, wird
                    if(pruefen())                // control auf true gesetzt,
                    {                            // die schleife verlassen und
                        control = true;          // mit dem nächsten feld weiter gemacht.
                        break;                   // wenn keine zahl von 1 bis 9 zu einem
                    }                            // gültigen Sudoku führt, bleibt control
                }                                // auf false und der eigentliche backtracking
                                                 // algorithmus setzt ein

                if(! control)                    // dieser block wird ausgeführt, wenn keine
                {                                // zahl für das feld arr[x][y] zu einem gültigen Sudoku führt
                    arr[x][y]=0;                 // das Feld arr[x][y] wird daher auf 0 gesetzt

                    for(;;)                      // diese for-Schleife sucht nach einem Feld, das VOR
                    {                            // dem Feld arr[x][y] liegt und nich von Anfang an belegt ist

                        --x;                     // x Koordinate um eins verkleinern (also ein Feld zurück gehen)
                        if(x&lt;0){x=8;--y;}        // falls das ende der zeile erreicht ist, eine zeile weiter oben suchen

                        if(start[x][y]==false)   // wenn das so ermittelte Feld nicht von Anfang an belegt ist,
                        {                        // .
                            xc=x; // siehe       // .
                            yc=y; // unten       // .
                            ++arr[x][y];         // wird sein Wert um 1 erhöht
                            if(arr[x][y]==10)    // Sollte in dem Feld nun eine 10 stehen (was ja ungültig ist)
                            {                    // wird es auf 0 zurück gesetzt. die Schleife beginnt von neuem
                                arr[x][y]=0;     // und sucht das nächste editierbare Feld

                                if(x==0 &amp;&amp; y==0) // falls das feld[0][0] auf 10 gesetzt wird
                                    return false;// wurden ALLE möglichen Kombinationen für das Sudoku ausprobiert.
                            }                    // das sudoku ist damit unlösbar

                            if(arr[x][y]!=0)     // wenn ++arr[x][y] einen gültigen Wert ergibt
                                break;           // werden ALLE schleifen - bis auf die große
                        }                        // Endlosschleife - verlassen.
                    }                            // Die Koordinaten des Feldes arr[x][y] wurden
                }                                // in den Variablen xc und yc gespeichert.
                if(!control)                     // Dies führt dazu, dass die Schleifen, die die
                    break;                       // x- und y-koordinate ändern, NACH dem Feld beginnen,
            }                                    // dessen Wert zuvor um 1 erhöht wurde
            if(!control)                         // .
                break;                           // .
        }                                        // .
    }
    return true;
}
</code></pre>
<p>Wo liegt mein Denkfehler?</p>
<p>Bin über alle Tipps froh!</p>
<p>Mfg Greedy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652337</guid><dc:creator><![CDATA[Mütze]]></dc:creator><pubDate>Sun, 25 Jan 2009 23:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to Backtracking Algorithmus. (Zu) kompliziert? on Mon, 26 Jan 2009 09:32:41 GMT]]></title><description><![CDATA[<p>Mein erster Tipp wär mal Funktionalität auszulagern, so wie du das mit pruefen schon angefangen hast. Der Test ob das Feld komplett ausgefüllt ist, kann auch ganz prima in eine Funktion.</p>
<p>Vielleicht kannst Du mit nem Debugger rausfinden wo er sich genau aufhängt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652488</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Mon, 26 Jan 2009 09:32:41 GMT</pubDate></item><item><title><![CDATA[Reply to Backtracking Algorithmus. (Zu) kompliziert? on Mon, 26 Jan 2009 10:32:11 GMT]]></title><description><![CDATA[<p>Da gabs doch auch nen anderen Thread dazu... Da hatte ich dir auch gesagt, dass es so, wie du das machst nicht gerade toll ist - weil man eben nacheinander Zahlen ausschließt und nicht zwingend immer irgendwo nen Feld hat, wo es klar ist, welche Zahl reinkommt...</p>
<p>ansonsten: siehe Vorredner ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652540</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 26 Jan 2009 10:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to Backtracking Algorithmus. (Zu) kompliziert? on Mon, 26 Jan 2009 12:44:01 GMT]]></title><description><![CDATA[<p>Hängst sich denn das Ganze überhaupt auf oder braucht deine Funktion einfach nur tierisch lange weil du ja anscheinend den ganzen Lösungsraum durchsuchst ?</p>
<p>Nimm mal einen Debugger und schaue dir mal jedes Feld nach jedem Setzen eines Kästchen an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652584</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Mon, 26 Jan 2009 12:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Backtracking Algorithmus. (Zu) kompliziert? on Mon, 26 Jan 2009 17:05:07 GMT]]></title><description><![CDATA[<p>Ich habe jetzt mal in die Schleife, die die Zahlen einsetzt, Folgenden Code eingefügt.</p>
<pre><code class="language-cpp">system(&quot;cls&quot;);
PrintArray(); //gibt Array aus
getch();
</code></pre>
<p>D.h. ich kann Schleifendurchlauf für Schleifendurchlauf genau verfolgen, was passiert.</p>
<p>Wenn ich jetzt als Ausgang folgendes Sudoku nehme</p>
<pre><code>0 [b]3[/b] 0 | 0 0 0 | 0 0 0
0 0 0 | [b]1 9 5[/b] | 0 0 0
0 [b]9 8[/b] | 0 0 0 | 0 [b]6[/b] 0
------+-------+------
[b]8[/b] 0 0 | 0 [b]6[/b] 0 | 0 0 0
[b]4[/b] 0 0 | 0 0 [b]3[/b] | 0 0 [b]1[/b]
0 0 0 | 0 [b]2[/b] 0 | 0 0 0
------+-------+------
0 [b]6[/b] 0 | 0 0 0 | [b]2 8[/b] 0
0 0 0 | [b]4 1 9[/b] | 0 0 [b]5[/b]
0 0 0 | 0 0 0 | 0 [b]7[/b] 0
</code></pre>
<p>beginnt das programm auch ganz normal, Zahlen auszuprobieren. So erreicht das Programm irgendwann zB den Stand:</p>
<pre><code>1 [b]3[/b] 2 | 6 4 7 | 5 9 8
6 4 7 | [b]1 9 5[/b] | 3 2 9
0 [b]9 8[/b] | 0 0 0 | 0 [b]6[/b] 0
------+-------+------
[b]8[/b] 0 0 | 0 [b]6[/b] 0 | 0 0 0
[b]4[/b] 0 0 | 0 0 [b]3[/b] | 0 0 [b]1[/b]
0 0 0 | 0 [b]2[/b] 0 | 0 0 0
------+-------+------
0 [b]6[/b] 0 | 0 0 0 | [b]2 8[/b] 0
0 0 0 | [b]4 1 9[/b] | 0 0 [b]5[/b]
0 0 0 | 0 0 0 | 0 [b]7[/b] 0
</code></pre>
<p>Da das ja ein ungültiges Sudoku ist wird weiter &quot;gebacktrackt&quot;, bis Folgendes Sudoku entsteht:</p>
<pre><code>1 [b]3[/b] 2 | 6 4 7 | 5 9 8
9 8 0 | [b]1 9 5[/b] | 3 2 9
0 [b]9 8[/b] | 0 0 0 | 0 [b]6[/b] 0
------+-------+------
[b]8[/b] 0 0 | 0 [b]6[/b] 0 | 0 0 0
[b]4[/b] 0 0 | 0 0 [b]3[/b] | 0 0 [b]1[/b]
0 0 0 | 0 [b]2[/b] 0 | 0 0 0
------+-------+------
0 [b]6[/b] 0 | 0 0 0 | [b]2 8[/b] 0
0 0 0 | [b]4 1 9[/b] | 0 0 [b]5[/b]
0 0 0 | 0 0 0 | 0 [b]7[/b] 0
</code></pre>
<p>Konnte ich vorher mit einem Tastendruck weitere Zahlen einsetzten, hängt sich das Programm hier auf (als wäre es in einer Endlosschleife gefangen).</p>
<p>Mit dem Debugger kenne ich mich leider überhaupt nicht aus. Kann jemand an meinem Quelltext sehen, woran das Problem liegen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652750</guid><dc:creator><![CDATA[Mütze]]></dc:creator><pubDate>Mon, 26 Jan 2009 17:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to Backtracking Algorithmus. (Zu) kompliziert? on Mon, 26 Jan 2009 17:07:25 GMT]]></title><description><![CDATA[<p>Edit:<br />
Das Feld, bei dem sich das Programm aufhängt ist dieses hier:</p>
<pre><code>1 [b]3[/b] 2 | 6 4 7 | 5 9 8
9 8 0 | [b]1 9 5[/b] | 0 0 0
0 [b]9 8[/b] | 0 0 0 | 0 [b]6[/b] 0
------+-------+------
[b]8[/b] 0 0 | 0 [b]6[/b] 0 | 0 0 0
[b]4[/b] 0 0 | 0 0 [b]3[/b] | 0 0 [b]1[/b]
0 0 0 | 0 [b]2[/b] 0 | 0 0 0
------+-------+------
0 [b]6[/b] 0 | 0 0 0 | [b]2 8[/b] 0
0 0 0 | [b]4 1 9[/b] | 0 0 [b]5[/b]
0 0 0 | 0 0 0 | 0 [b]7[/b] 0
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1652754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652754</guid><dc:creator><![CDATA[Mütze]]></dc:creator><pubDate>Mon, 26 Jan 2009 17:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to Backtracking Algorithmus. (Zu) kompliziert? on Mon, 26 Jan 2009 17:31:20 GMT]]></title><description><![CDATA[<p>Edit2:</p>
<p>Fehler gefunden.</p>
<p>In Zeile 28 muss es statt</p>
<pre><code class="language-cpp">if(arr[x][y]!=0)
    continue;
</code></pre>
<pre><code class="language-cpp">if(arr[x][y]!=0)
{
    control=true;
    continue;
}
</code></pre>
<p>heißen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652762</guid><dc:creator><![CDATA[Mütze]]></dc:creator><pubDate>Mon, 26 Jan 2009 17:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Backtracking Algorithmus. (Zu) kompliziert? on Tue, 27 Jan 2009 12:10:19 GMT]]></title><description><![CDATA[<p>Siehste, mit Debugging und insbesondere Debugging-Ausgaben kann man viele Fehler finden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653152</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Tue, 27 Jan 2009 12:10:19 GMT</pubDate></item></channel></rss>