<?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[Sudoku Optimierung [war: mütze]]]></title><description><![CDATA[<p>Hallo,<br />
wieder geht es um das Thema Sudoku^^</p>
<p>Ich denke (oder hoffe), dass man aus der Funktion, die das Sudoku auf gültigkeit prüft, noch einiges an Geschwindigkeit herausholen kann. allerdings fiele mir kein weg ein, wie ich das anstellen sollte.<br />
Die Funktion, die das <strong>int arr[9][9]</strong> prüft, sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">bool pruefen()
{
    int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;

    //zeilen prüfen
    for(int l=0;l!=9;++l)
    {
        for(int k=0;k!=9;++k)
        {
            if(arr[k][l]==1)++a;
            if(arr[k][l]==2)++b;
            if(arr[k][l]==3)++c;
            if(arr[k][l]==4)++d;
            if(arr[k][l]==5)++e;
            if(arr[k][l]==6)++f;
            if(arr[k][l]==7)++g;
            if(arr[k][l]==8)++h;
            if(arr[k][l]==9)++i;
        }
        if(a&gt;1)return false;
        if(b&gt;1)return false;
        if(c&gt;1)return false;
        if(d&gt;1)return false;
        if(e&gt;1)return false;
        if(f&gt;1)return false;
        if(g&gt;1)return false;
        if(h&gt;1)return false;
        if(i&gt;1)return false;
        a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;
    }

    //spalten prüfen
    for(int k=0;k!=9;++k)
    {
        for(int l=0;l!=9;++l)
        {
            if(arr[k][l]==1)++a;
            if(arr[k][l]==2)++b;
            if(arr[k][l]==3)++c;
            if(arr[k][l]==4)++d;
            if(arr[k][l]==5)++e;
            if(arr[k][l]==6)++f;
            if(arr[k][l]==7)++g;
            if(arr[k][l]==8)++h;
            if(arr[k][l]==9)++i;
        }
        if(a&gt;1)return false;
        if(b&gt;1)return false;
        if(c&gt;1)return false;
        if(d&gt;1)return false;
        if(e&gt;1)return false;
        if(f&gt;1)return false;
        if(g&gt;1)return false;
        if(h&gt;1)return false;
        if(i&gt;1)return false;
        a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;
    }

    //die 3x3 Felder prüfen
    int aa=0,bb=0,cc=0,dd=0;

    for(int m=0;m!=3;++m)
    {
        if(m==0){cc=0;dd=3;}
        if(m==1){cc=3;dd=6;}
        if(m==2){cc=6;dd=9;}
        for(int n=0;n!=3;++n)
        {
            if(n==0){aa=0;bb=3;}
            if(n==1){aa=3;bb=6;}
            if(n==2){aa=6;bb=9;}
            for(int l=aa;l!=bb;++l)
            {
                for(int k=cc;k!=dd;++k)
                {
                    if(arr[k][l]==1)++a;
                    if(arr[k][l]==2)++b;
                    if(arr[k][l]==3)++c;
                    if(arr[k][l]==4)++d;
                    if(arr[k][l]==5)++e;
                    if(arr[k][l]==6)++f;
                    if(arr[k][l]==7)++g;
                    if(arr[k][l]==8)++h;
                    if(arr[k][l]==9)++i;
                }
            }
            if(a&gt;1)return false;
            if(b&gt;1)return false;
            if(c&gt;1)return false;
            if(d&gt;1)return false;
            if(e&gt;1)return false;
            if(f&gt;1)return false;
            if(g&gt;1)return false;
            if(h&gt;1)return false;
            if(i&gt;1)return false;
            a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;
        }
    }

return true;
}
</code></pre>
<p>Es geht bestimmt auch eleganter. Aber geht es auch schneller? Da die Funktion in meinem Backtracking Algorithmus sehr oft aufgerufen wird, würde das ganze Programm stark von einem solchen Geschwindikeitsgewinn profitieren.</p>
<p>Schonmal Danke für alle Tipps und Anregungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/232907/sudoku-optimierung-war-mütze</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 21:31:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232907.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Jan 2009 16:47:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Wed, 28 Jan 2009 17:45:28 GMT]]></title><description><![CDATA[<p>Hallo,<br />
wieder geht es um das Thema Sudoku^^</p>
<p>Ich denke (oder hoffe), dass man aus der Funktion, die das Sudoku auf gültigkeit prüft, noch einiges an Geschwindigkeit herausholen kann. allerdings fiele mir kein weg ein, wie ich das anstellen sollte.<br />
Die Funktion, die das <strong>int arr[9][9]</strong> prüft, sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">bool pruefen()
{
    int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;

    //zeilen prüfen
    for(int l=0;l!=9;++l)
    {
        for(int k=0;k!=9;++k)
        {
            if(arr[k][l]==1)++a;
            if(arr[k][l]==2)++b;
            if(arr[k][l]==3)++c;
            if(arr[k][l]==4)++d;
            if(arr[k][l]==5)++e;
            if(arr[k][l]==6)++f;
            if(arr[k][l]==7)++g;
            if(arr[k][l]==8)++h;
            if(arr[k][l]==9)++i;
        }
        if(a&gt;1)return false;
        if(b&gt;1)return false;
        if(c&gt;1)return false;
        if(d&gt;1)return false;
        if(e&gt;1)return false;
        if(f&gt;1)return false;
        if(g&gt;1)return false;
        if(h&gt;1)return false;
        if(i&gt;1)return false;
        a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;
    }

    //spalten prüfen
    for(int k=0;k!=9;++k)
    {
        for(int l=0;l!=9;++l)
        {
            if(arr[k][l]==1)++a;
            if(arr[k][l]==2)++b;
            if(arr[k][l]==3)++c;
            if(arr[k][l]==4)++d;
            if(arr[k][l]==5)++e;
            if(arr[k][l]==6)++f;
            if(arr[k][l]==7)++g;
            if(arr[k][l]==8)++h;
            if(arr[k][l]==9)++i;
        }
        if(a&gt;1)return false;
        if(b&gt;1)return false;
        if(c&gt;1)return false;
        if(d&gt;1)return false;
        if(e&gt;1)return false;
        if(f&gt;1)return false;
        if(g&gt;1)return false;
        if(h&gt;1)return false;
        if(i&gt;1)return false;
        a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;
    }

    //die 3x3 Felder prüfen
    int aa=0,bb=0,cc=0,dd=0;

    for(int m=0;m!=3;++m)
    {
        if(m==0){cc=0;dd=3;}
        if(m==1){cc=3;dd=6;}
        if(m==2){cc=6;dd=9;}
        for(int n=0;n!=3;++n)
        {
            if(n==0){aa=0;bb=3;}
            if(n==1){aa=3;bb=6;}
            if(n==2){aa=6;bb=9;}
            for(int l=aa;l!=bb;++l)
            {
                for(int k=cc;k!=dd;++k)
                {
                    if(arr[k][l]==1)++a;
                    if(arr[k][l]==2)++b;
                    if(arr[k][l]==3)++c;
                    if(arr[k][l]==4)++d;
                    if(arr[k][l]==5)++e;
                    if(arr[k][l]==6)++f;
                    if(arr[k][l]==7)++g;
                    if(arr[k][l]==8)++h;
                    if(arr[k][l]==9)++i;
                }
            }
            if(a&gt;1)return false;
            if(b&gt;1)return false;
            if(c&gt;1)return false;
            if(d&gt;1)return false;
            if(e&gt;1)return false;
            if(f&gt;1)return false;
            if(g&gt;1)return false;
            if(h&gt;1)return false;
            if(i&gt;1)return false;
            a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;
        }
    }

return true;
}
</code></pre>
<p>Es geht bestimmt auch eleganter. Aber geht es auch schneller? Da die Funktion in meinem Backtracking Algorithmus sehr oft aufgerufen wird, würde das ganze Programm stark von einem solchen Geschwindikeitsgewinn profitieren.</p>
<p>Schonmal Danke für alle Tipps und Anregungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653963</guid><dc:creator><![CDATA[Algorithmus Performance]]></dc:creator><pubDate>Wed, 28 Jan 2009 17:45:28 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Wed, 28 Jan 2009 16:51:00 GMT]]></title><description><![CDATA[<p>1. Ja es geht schneller.<br />
2. Das nächste mal wählst du lieber eine Überschrift wie &quot;Hund&quot; oder &quot;Auto&quot; dann weiß man direkt das es sich um Sudoku handelt. Troll!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653965</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Wed, 28 Jan 2009 16:51:00 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Wed, 28 Jan 2009 18:03:08 GMT]]></title><description><![CDATA[<p>2 Ansaetze:</p>
<ol>
<li></li>
</ol>
<p>1+2+3+4+5+6+7+8+9=45<br />
1*2*3*4*5*6*7*8*9=362880</p>
<p>So kannst du ohne Spruenge alle Zeilen aufsummieren. Dazu noch jeweils ein Array fuer die summe und das produkt der spalten.<br />
Denn egal in welcher reihenfolge die zahlen vorkommen, die beiden ergebnisse muessen stimmen.</p>
<p>(Pseudocode):</p>
<pre><code class="language-cpp">int sumres[9]={45};
int prodres[9]={362880};
int sumarr[9]={0};
int prodarr[9]={1};
for(int i=0;i&lt;9;++i) {
  int sum=0, prod=1;
  for(int j=0:j&lt;9;++j) {
    int val=feld[i][j];
    sum+=val;
    prod*=val;
    sumarr[j]+=val;
    prodarr[j]*=val;
  }
  if(sum!=45 || prod!=362880) return false;
}
return !memcmp(sumres, sumarr) &amp;&amp; !memcmp(prodres, prodarr);
</code></pre>
<p>Der Nachteil: wenn die Zeilen alle korrekt sind aber die Spalten fehler haben dauert es recht lange bis man den Fehler findet...</p>
<ol start="2">
<li></li>
</ol>
<p>Du verwendest 2 maps: eine zeilen map und eine spalten map.<br />
wo jeweils in der 2. dimension die anzahl der vorkommen der zahl in der spalte/zeile steht.</p>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox3201" checked="true" /><label for="checkbox3201">steht wie oft die zahl x in der zeile 1 vorkommt.</label></div></p>
<p>(Pseudocode)</p>
<pre><code class="language-cpp">int zeilen[9][9]={0};
int spalten[9][9]={0};
for(int i=0;i&lt;9;++i) {
  for(int j=0:j&lt;9;++j) {
    int val=feld[i][j];
    if(zeilen[i][val]) return false;
    zeilen[i][val]=1;

    if(spalten[j][val]) return false;
    spalten[j][val]=1;
  }
}
return true;
</code></pre>
<p>Hier brichst du deutlich frueher ab, aber dafuer dauert ein kompletter durchgang fuer ein korrektes sudoku vermutlich laenger.</p>
<p>das sind so in etwa die 2 ansaetze die ich verfolgen wuerde...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654008</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 28 Jan 2009 18:03:08 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Wed, 28 Jan 2009 23:59:54 GMT]]></title><description><![CDATA[<p>Unglaublich!<br />
Mit meinem ersten Ansatz (siehe 1. Post) habe ich für ein bestimmes Sudoku 1,8 Minuten gebraucht. Mit Shade Of Mine's 2. Ansatz sind es 0,16 SEKUNDEN!</p>
<p>Ist es wirklich ein sooo großer Unterschied, ob ich die Zeilen/Spalten nicht so</p>
<pre><code class="language-cpp">bool pruefen()
{
    int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;

    //zeilen prüfen
    for(int l=0;l!=9;++l)
    {
        for(int k=0;k!=9;++k)
        {
            if(arr[k][l]==1)++a;
            if(arr[k][l]==2)++b;
            if(arr[k][l]==3)++c;
            if(arr[k][l]==4)++d;
            if(arr[k][l]==5)++e;
            if(arr[k][l]==6)++f;
            if(arr[k][l]==7)++g;
            if(arr[k][l]==8)++h;
            if(arr[k][l]==9)++i;
        }
        if(a&gt;1)return false;
        if(b&gt;1)return false;
        if(c&gt;1)return false;
        if(d&gt;1)return false;
        if(e&gt;1)return false;
        if(f&gt;1)return false;
        if(g&gt;1)return false;
        if(h&gt;1)return false;
        if(i&gt;1)return false;
        a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;
    }

    //spalten prüfen
    for(int k=0;k!=9;++k)
    {
        for(int l=0;l!=9;++l)
        {
            if(arr[k][l]==1)++a;
            if(arr[k][l]==2)++b;
            if(arr[k][l]==3)++c;
            if(arr[k][l]==4)++d;
            if(arr[k][l]==5)++e;
            if(arr[k][l]==6)++f;
            if(arr[k][l]==7)++g;
            if(arr[k][l]==8)++h;
            if(arr[k][l]==9)++i;
        }
        if(a&gt;1)return false;
        if(b&gt;1)return false;
        if(c&gt;1)return false;
        if(d&gt;1)return false;
        if(e&gt;1)return false;
        if(f&gt;1)return false;
        if(g&gt;1)return false;
        if(h&gt;1)return false;
        if(i&gt;1)return false;
        a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;
    }
}
</code></pre>
<p>sondern so</p>
<pre><code class="language-cpp">bool pruefen()
{
    int waagerecht[9][9]={{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0}};
    int senkrecht[9][9]={{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0}};
    int val=1;
    for(int y=0;y!=9;++y)
    {
        for(int x=0;x!=9;++x)
        {
            if(arr[x][y])
                val=arr[x][y];
            else               //falls das Feld eine null enthält
                continue;

            if(waagerecht[x][val])
                return false;
            waagerecht[x][val]=1;

            if(arr[y][x])
                val=arr[y][x];
            else              //falls das Feld eine null enthält
                continue;

            if(senkrecht[x][val])
                return false;
            senkrecht[x][val]=1;
        }
        for(int z=0;z!=9;++z)   //array zurücksetzen
        {
            for(int p=0;p!=9;++p)
            {
                waagerecht[z][p]=0;
                senkrecht[z][p]=0;
            }
        }
    }
}
</code></pre>
<p>durchgehe??<br />
Was kostet an meinem Ansatz denn so immens viel mehr Zeit?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>(zum Threadtitel: ich habe die Eingabefelder &quot;Benutzername&quot; und &quot;Titel&quot; vertauscht. SORRY <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654134</guid><dc:creator><![CDATA[mütze]]></dc:creator><pubDate>Wed, 28 Jan 2009 23:59:54 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Thu, 29 Jan 2009 00:11:10 GMT]]></title><description><![CDATA[<p>edit: hm mein neuer prüfen algorithmus funktioniert natürlich nicht (x und y müssten bei den beiden array vertauscht werden, war ich wohl zu voreilig <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="😃"
    /> ). Da muss ich nochmal ne nacht drüber schlafen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654139</guid><dc:creator><![CDATA[mütze]]></dc:creator><pubDate>Thu, 29 Jan 2009 00:11:10 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Thu, 29 Jan 2009 10:14:50 GMT]]></title><description><![CDATA[<p>mütze schrieb:</p>
<blockquote>
<p>Unglaublich!<br />
Mit meinem ersten Ansatz (siehe 1. Post) habe ich für ein bestimmes Sudoku 1,8 Minuten gebraucht.</p>
</blockquote>
<p>Kannst Du dieses Sudoku bitte mal posten? Ich würde es gerne mal durch mein Prog laufen lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654252</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 29 Jan 2009 10:14:50 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Thu, 29 Jan 2009 13:44:28 GMT]]></title><description><![CDATA[<p>klar</p>
<pre><code>0 0 0 0 0 0 0 1 0 
4 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 
0 0 0 0 5 0 4 0 7 
0 0 8 0 0 0 3 0 0 
0 0 1 0 9 0 0 0 0 
3 0 0 4 0 0 2 0 0 
0 5 0 1 0 0 0 0 0 
0 0 0 8 0 6 0 0 0
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1654371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654371</guid><dc:creator><![CDATA[mütze]]></dc:creator><pubDate>Thu, 29 Jan 2009 13:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Thu, 29 Jan 2009 18:21:56 GMT]]></title><description><![CDATA[<p>Du wirst nicht schneller werden, wenn du staendig alle Bedingungen testest. Warum solltest du auch. Du brauchst nur die Bedingungen neu pruefen, die von der aktuelle Veraenderung betroffen sind. Das setzen einer Zahl hat Einfluss auf nur 3 Bedingungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654552</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 29 Jan 2009 18:21:56 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Thu, 29 Jan 2009 20:08:22 GMT]]></title><description><![CDATA[<p>Wenn es ihm auf Geschwindigkeit ankommt, hätte er mal auf mich hören sollen und ein Array á la <code>bool feld[9][9][9]</code> nehmen sollen - damit schafft man das Sodoku, für das er ein paar Minuten braucht, in ein paar Sekunden...<br />
Es geht hier nun mal um Logik und nicht darum, einfach stumpf alles durchzuprobieren...<br />
Mit meinem Lösungsansatz könnte man btw auch größere Sodokus lösen (0-F, 16Felder pro Quadrat) - so, wie man sie auch ab und an mal sieht... Und das wichtigste: Die benötigte Zeit steigt nicht expotentiell (wie das eben bei bruteforce-algorithmen so üblich ist)...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654623</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 29 Jan 2009 20:08:22 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Thu, 29 Jan 2009 23:49:33 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Du wirst nicht schneller werden, wenn du staendig alle Bedingungen testest. Warum solltest du auch. Du brauchst nur die Bedingungen neu pruefen, die von der aktuelle Veraenderung betroffen sind. Das setzen einer Zahl hat Einfluss auf nur 3 Bedingungen.</p>
</blockquote>
<p>Darauf bin ich garnicht gekommen <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="😃"
    /> Wenn ich jedesmal nur die Zeile/Spalte/das 3x3 Feld prüfe, das gerade geändert wurde, komme ich für das sudoku, was vorher 1,5min gebraucht, auf ca 30sek.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>Wenn es ihm auf Geschwindigkeit ankommt, hätte er mal auf mich hören sollen und ein Array á la <code>bool feld[9][9][9]</code> nehmen sollen - damit schafft man das Sodoku, für das er ein paar Minuten braucht, in ein paar Sekunden...</p>
</blockquote>
<p>Das Problem ist, dass ich mit deiner Variante (soweit ich die durchschaut habe) keine leeren Sudokus bzw Sudokus, wo nur ein oder zwei Zahlen vorgegeben sind, lösen kann. Mit dem backtracking kann ich jedes Sudoku lösen.<br />
Und andere Sudokus als 9x9 Sudokus möchte ich garnicht lösen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654726</guid><dc:creator><![CDATA[mütze]]></dc:creator><pubDate>Thu, 29 Jan 2009 23:49:33 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Fri, 30 Jan 2009 07:17:58 GMT]]></title><description><![CDATA[<p>Dieser Bruteforce-Sover ist aber extrem schnell!</p>
<pre><code class="language-cpp">#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

int maxresults = 1;
int results = 0;
FILE *outfile;

void saveresult(const char *s) {
    fwrite(s, 1, 81, outfile);
    fprintf(outfile, &quot;\n&quot;);
    return;
}

bool check(const char * s, int p) {
    char v = s[p];
    int x = p % 9;
    int y = p / 9;
    int qx = (int) (x / 3)*3;
    int qy = (int) (y / 3)*3;

    for (int r = 0; r &lt; 3; r++) {
        int cp = (qy + r)*9 + qx;
        for (int c = 0; c &lt; 3; c++) {
            if (c + cp != p &amp;&amp; s[c + cp] == v) {
                return false;
            }
        }
    }

    for (int i = 0; i &lt; 9; i++) {
        if (y * 9 + i != p &amp;&amp; s[y * 9 + i] == v) {
            return false;
        }

        if (x + i * 9 != p &amp;&amp; s[x + i * 9] == v) {
            return false;
        }
    }
    return true;
}

bool solve(const char * sp, int p) {

    char s[81];
    strcpy(s, sp);

    if (p == 81) {
        results++;
        saveresult(s);
        return true;
    }

    if (s[p] != '0') {
        return solve(s, p + 1);
    }

    for (char i = '1'; i &lt;= '9'; i++) {
        s[p] = i;
        if (!check(s, p)) {
            continue;
        }

        bool rc = solve(s, p + 1);
        if (rc &amp;&amp; results &gt; maxresults - 1) {
            return true;
        }
    }
    return false;
}

int main(int argc, char *argv[]) {
    if (argc != 4) {
        return 1;
    }

    char s[81];
    memset(s, '0', 81);
    for (int i = 0; i &lt; 81 &amp;&amp; argv[1][i] != '\0'; i++) {
        s[i] = argv[1][i];
    }

    outfile = fopen(argv[2], &quot;wt&quot;);
    if (outfile == NULL) {
        return 1;
    }

    maxresults = atoi(argv[3]);
    solve(s, 0);
    fclose(outfile);
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1654727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654727</guid><dc:creator><![CDATA[Nemonisinili]]></dc:creator><pubDate>Fri, 30 Jan 2009 07:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to Sudoku Optimierung [war: mütze] on Fri, 30 Jan 2009 00:49:30 GMT]]></title><description><![CDATA[<p>ich würde die daten anders speichern.<br />
mal ein kleiner versuch:</p>
<p>es gibt 9 reihen, 9 spalten und 9 blöcke.<br />
jedes feld gehört zu einer reihe, einer spalte und einem block.<br />
ich möchte zur laufzeit wenig rechnen.<br />
integers kann ich als bitfelder mißbrauchen.</p>
<p>das mache ich so:</p>
<pre><code class="language-cpp">//bitfields
unsigned int reihen[9];
unsigned int spalten[9];
unsigned int bloecke[9];

//jedes Feld gehört zu drei bitfields
struct Feld{
  int zahl;
  unsigned int* reihe;
  unsigned int* spalte;
  unsigned int* block;
};

//naja, war ja klar, daß jetzt spwas kommt
Feld feld[9][9];
</code></pre>
<p>die zeiger auf die bitfields müssen mit ein paar schleifen vor dem eigentlichen suchlauf schnell gesetzt werden.</p>
<p>und</p>
<pre><code class="language-cpp">bool setze(Feld* f,int zahl){
  //prüfen
  unsigned int zahlbitmuster=1U&lt;&lt;zahl;
  if((f-&gt;reihe&amp;zahlbitmuster)!=0) return false;
  if((f-&gt;spalte&amp;zahlbitmusterl)!=0) return false;
  if((f-&gt;block&amp;zahlbitmuster)!=0) return false;
  //setzen
  f-&gt;reihe|=zahlbitmuster;
  f-&gt;spalte|=zahlbitmuster;
  f-&gt;block|=zahlbitmuster;
  f-&gt;zahl=zahl;
  return true;
}
void loesche(Feld* f){
  //zurüclnehmen, dadurch muss im rekursiven abstieg niemals der ganze
  //spielstand gespeichert werden
  unsigned int zahlbitmuster=1U&lt;&lt;f-&gt;zahl;
  f-&gt;reihe&amp;=~zahlbitmuster;
  f-&gt;spalte&amp;=~zahlbitmuster;
  f-&gt;block&amp;=~zahlbitmuster;
  f-&gt;zahl=0;
}
</code></pre>
<p>klingt ganz lecker. aber in dem versuch steckt null sudokuwissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654732</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 30 Jan 2009 00:49:30 GMT</pubDate></item></channel></rss>