<?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[Problem bei Rekursion zur Sudokulösung]]></title><description><![CDATA[<p>Hallo!<br />
Ich arbeite zurzeit an einem Programm, welches mir ein fertig gelöstes in sich stimmiges Sudoku erstellen soll. Ich habe mir gedacht, dies rekursiv zu lösen, aber so wirklich endgültig verstanden, scheine ich die Rekursion noch nicht zu haben. Mein Programm ist zwar lauffähig, aber es spuckt mir nur unfertige Sudokus aus.</p>
<p>Hier der Quelltext der rekursiven Funktion:</p>
<pre><code class="language-csharp">int sudofill(int zahl,int x,int y)
{
if(sudotest(zahl,x,y))sudo[x][y]=zahl;
else {return 0;}
bool keineNullen=true;
	for(int i=0;i&lt;9;i++)
	for(int j=0;j&lt;9;j++)
	if(sudo[i][j]==0)keineNullen=false;
if(keineNullen)return 1;
x=(rand()%9)+1;
y=(rand()%9)+1;
for(int i=1;i&lt;10;i++)
	{
	int erg=sudofill(i,x,y);
	if(erg==1)return 1;
	//if(i==9)i=1;
	}

}
</code></pre>
<p>Ich hoffe jemand kann mir helfen, mein Problem zu erkennen.<br />
sudotest(zahl,x,y) gibt wahr zurück, wenn die zahl an der angegebenden Koordinate eintragbar ist.</p>
<p>lg Tino Raspari</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205834/problem-bei-rekursion-zur-sudokulösung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 13:22:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205834.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Feb 2008 14:47:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei Rekursion zur Sudokulösung on Mon, 18 Feb 2008 14:47:07 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich arbeite zurzeit an einem Programm, welches mir ein fertig gelöstes in sich stimmiges Sudoku erstellen soll. Ich habe mir gedacht, dies rekursiv zu lösen, aber so wirklich endgültig verstanden, scheine ich die Rekursion noch nicht zu haben. Mein Programm ist zwar lauffähig, aber es spuckt mir nur unfertige Sudokus aus.</p>
<p>Hier der Quelltext der rekursiven Funktion:</p>
<pre><code class="language-csharp">int sudofill(int zahl,int x,int y)
{
if(sudotest(zahl,x,y))sudo[x][y]=zahl;
else {return 0;}
bool keineNullen=true;
	for(int i=0;i&lt;9;i++)
	for(int j=0;j&lt;9;j++)
	if(sudo[i][j]==0)keineNullen=false;
if(keineNullen)return 1;
x=(rand()%9)+1;
y=(rand()%9)+1;
for(int i=1;i&lt;10;i++)
	{
	int erg=sudofill(i,x,y);
	if(erg==1)return 1;
	//if(i==9)i=1;
	}

}
</code></pre>
<p>Ich hoffe jemand kann mir helfen, mein Problem zu erkennen.<br />
sudotest(zahl,x,y) gibt wahr zurück, wenn die zahl an der angegebenden Koordinate eintragbar ist.</p>
<p>lg Tino Raspari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458233</guid><dc:creator><![CDATA[Tino Raspari]]></dc:creator><pubDate>Mon, 18 Feb 2008 14:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Rekursion zur Sudokulösung on Mon, 18 Feb 2008 19:27:41 GMT]]></title><description><![CDATA[<p>ok langsam:</p>
<pre><code class="language-cpp">if(sudo[i][j]==0)keineNullen=false;
</code></pre>
<p>hast du erst alle felder wirklich mit mit der Zahl 0 initialisiert?</p>
<pre><code class="language-cpp">x=(rand()%9)+1;
y=(rand()%9)+1;
</code></pre>
<p>springst du hier in ein zufälliges Feld? und wenn, warum +1? ich dachte dein array fängt mit index 0 an?</p>
<p>Wann rufst du sudofill überhaupt auf? zeig mal den gesamten code...scheint irgendwie ziemlich wirr zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458424</guid><dc:creator><![CDATA[XaTrIxX]]></dc:creator><pubDate>Mon, 18 Feb 2008 19:27:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Rekursion zur Sudokulösung on Mon, 18 Feb 2008 19:35:43 GMT]]></title><description><![CDATA[<p>Moin^^<br />
Also das mit dem +1 bei der rand funktion hab ich schon wieder behoben...<br />
war nurn flüchtigkeitsfehler, sieht man ja an der Ausgabe^^<br />
hier also der gesammte Quelltext:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;time.h&gt;
#include&lt;fstream&gt;
using namespace std;
int sudo[9][9];

bool sudotest(int zahl,int x,int  y)
{
bool res=true;	// Ergebnissspeicher
int i,j;	// Zählvariablen

// Testen der Zeile / Spalte
for (i=0;i&lt;9;i++)
    {
    if (sudo[i][y]==zahl) res = false;
    if (sudo[x][i]==zahl) res = false;
    }

// Testen des Blocks
int h1=x/3*3;
int h2=y/3*3;
for (i=0;i&lt;3;i++)
    for (j=0;j&lt;3;j++)
	if (sudo[h1+i][h2+j]==zahl) res = false;

return res;
}

void sudoterm()
{
for (int i=0;i&lt;9;i++)
    for(int j=0;j&lt;9;j++)
	sudo[i][j] = 0;
}

int sudofill(int zahl,int x,int y)
{
if(sudotest(zahl,x,y))sudo[x][y]=zahl;
else {return 0;}
bool keineNullen=true;
	for(int i=0;i&lt;9;i++)
	for(int j=0;j&lt;9;j++)
	if(sudo[i][j]==0)keineNullen=false;
if(keineNullen)return 1;
randxy:
x=(rand()%9);
y=(rand()%9);
if(sudo[x][y]!=0)goto randxy;
for(int i=1;i&lt;10;i++)
	{
	int erg=sudofill(i,x,y);
	if(erg==1)return 1;
	//if(erg==3){sudo[x][y]=0;return 0;}
	}
return 0;
}

void sudocall()
{
for (int i=0;i&lt;9;i++)
    {
    for (int j=0;j&lt;9;j++) cout&lt;&lt;sudo[j][i]&lt;&lt;&quot; &quot;;
    cout&lt;&lt;endl;	
    }
}

int main()
{

srand( (unsigned)time( NULL ) );
ofstream OF;
OF.open(&quot;Sudokus.txt&quot;);
for(int i=0;i&lt;50;i++)
{sudoterm();
hier2:
// srand( (unsigned)time( NULL ) );
int x=((rand())%9),y=((rand())%9);
int zahl=(rand())%9+1;

int a;
for(int zahl=1;zahl&lt;=9;zahl++)
{a=sudofill(zahl,x,y);if(a)break;}
if(a)
{				
sudocall();
for(int j=0;j&lt;9;j++)
	{
		for(int k=0;k&lt;9;k++)
		{OF&lt;&lt;sudo[j][k]&lt;&lt;&quot; &quot;;}
	OF&lt;&lt;endl;
	}
OF&lt;&lt;endl;OF&lt;&lt;endl&lt;&lt;&quot;-------------------------------------&quot;&lt;&lt;i&lt;&lt;&quot;---------------&quot;&lt;&lt;endl;
cout&lt;&lt;(unsigned)time( NULL )&lt;&lt;endl;
}
else goto hier2;
}
OF.close();
return 0;
}
</code></pre>
<p>Achso wegen der Sache mit den keineNullen. Das mach erst Sinn wenn man sich denkt das die Rekursion schon tiefer ist. damit testet er quasi ob er schon fertig ist und wenn ja returned er 1. das wird dann durchgegeben bis zum Schluss..</p>
<p>lg Tino</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458429</guid><dc:creator><![CDATA[Tino Raspari]]></dc:creator><pubDate>Mon, 18 Feb 2008 19:35:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Rekursion zur Sudokulösung on Mon, 18 Feb 2008 19:47:40 GMT]]></title><description><![CDATA[<p>so also erstens:</p>
<p>wie dein Quellcode strukturiert ist, ist echt schlimm. Gewöhn dir ein bisschen einen schöneren Stil an.</p>
<p>Weiter: Das hier ist deine Schleife</p>
<pre><code class="language-cpp">for(int i=0;i&lt;50;i++)
{sudoterm();
hier2:
// srand( (unsigned)time( NULL ) );
int x=((rand())%9),y=((rand())%9);
int zahl=(rand())%9+1;

int a;
for(int zahl=1;zahl&lt;=9;zahl++)
{a=sudofill(zahl,x,y);if(a)break;}
if(a)
{               
sudocall();
for(int j=0;j&lt;9;j++)
    {
        for(int k=0;k&lt;9;k++)
        {OF&lt;&lt;sudo[j][k]&lt;&lt;&quot; &quot;;}
    OF&lt;&lt;endl;
    }
OF&lt;&lt;endl;OF&lt;&lt;endl&lt;&lt;&quot;-------------------------------------&quot;&lt;&lt;i&lt;&lt;&quot;---------------&quot;&lt;&lt;endl;
cout&lt;&lt;(unsigned)time( NULL )&lt;&lt;endl;
}
else goto hier2;
}
</code></pre>
<p>gleich zu beginn setzt du bei jedem Schleifendurchlauf alle Felder auf 0, und zwar mit sudocall....ich hab's noch nicht genau durchgeschaut (es ist echt mühsam bei der struktur), aber ich glaub das ist blödsinn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458436</guid><dc:creator><![CDATA[XaTrIxX]]></dc:creator><pubDate>Mon, 18 Feb 2008 19:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Rekursion zur Sudokulösung on Mon, 18 Feb 2008 20:02:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for(int zahl=1;zahl&lt;=9;zahl++)
{a=sudofill(zahl,x,y);if(a)break;}
</code></pre>
<p>an dieser Stelle wird Sudofill aufgerufen, welche sich rekursiv selbst aufruft.<br />
in dieser rekkursion überprüft er nun ob die angegebene zahl an angegebener stelle im sudoku so stehen könnte ohne gegen irgendwelche regeln zu verstoßen. wenn ja eintragen und neuen zufällig koordinate ran und wieder die zahlen von 1 bis 9 durchprobieren, wenns pass nächste und so weiter...</p>
<p>lg Tino</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458449</guid><dc:creator><![CDATA[Tino Raspari]]></dc:creator><pubDate>Mon, 18 Feb 2008 20:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Rekursion zur Sudokulösung on Mon, 18 Feb 2008 20:08:09 GMT]]></title><description><![CDATA[<p>wow ich versteh zwar deine erklärung aber dein code ist nur strange.<br />
Hast du ICQ oder was ähnliches um dir einige dinge zu erklären?</p>
<p>Das wäre viel zu aufwendig hier.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458455</guid><dc:creator><![CDATA[XaTrIxX]]></dc:creator><pubDate>Mon, 18 Feb 2008 20:08:09 GMT</pubDate></item></channel></rss>