<?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[Brauche mal Hilfe bei Backtracking Algo (Sudoku)]]></title><description><![CDATA[<p>Hallo. Ich bräuchte hier mal Hilfe bei meiner versuchten Sudoku Lösung.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

typedef int sfeld[9][9];
void Ausgabe(sfeld);
bool Loese(sfeld, int, int);
bool Pruefe(sfeld, int, int, int);

int main()
{
	sfeld Sudoku = {0,7,2,0,3,9,1,0,0,0,0,0,1,5,0,6,0,0,5,0,0,4,2,0,0,0,7,0,6,0,0,0,0,0,9,0,4,0,0,9,7,3,0,0,0,0,9,3,0,6,0,0,4,0,8,0,0,3,1,0,9,6,0,0,0,6,0,0,8,0,0,0,9,0,0,0,0,0,2,7,0};

	Ausgabe(Sudoku);

	if (!Loese(Sudoku, 0, 0))
	{
		cout &lt;&lt; &quot;Keine Lösung!&quot; &lt;&lt; endl;
	}
	cin.get();
}

bool Pruefe(sfeld TehFeld, int Zeile, int Spalte, int Wert)
{
	for (int i=0; i&lt;9; i++)
	{
		if ((Zeile != i) &amp;&amp; (Wert == TehFeld[i][Spalte])) { return 0; } //prüfen, ob der Wert in der Spalte schon enthalten ist
	}

	for (int i=0; i&lt;9; i++)
	{
		if ((Spalte != i) &amp;&amp; (Wert == TehFeld[Zeile][i])) { return 0; } //prüfen, ob der Wert in der Zeile schon enthalten ist
	}

	int k, l;
	k = (Zeile / 3);
	l = (Spalte / 3);

	for (int i = k*3; i &lt; k*3+3; i++)
	{
		for (int j = l*3; j &lt; l*3+3; j++)
		{
			if (((Zeile != i) || (Spalte != j)) &amp;&amp; (Wert == TehFeld[i][j])) { return 0; } //prüfen, ob Wert in Subquadrat schon enthalten ist
		}
	}
	return 1;
}

bool Loese(sfeld TehFeld, int Zeile, int Spalte)
{
	if (Zeile*Spalte &gt; 64) { Ausgabe(Sudoku); return 1; } //Lösung gefunden
	int n,m;
	n = Zeile;
	m = Spalte;
	n++;
	if (n &gt;= 8) { n = 0; m++; }

	if (TehFeld[Zeile][Spalte] == 0) //nur Felder bearbeiten, in denen noch keine Zahl vorgegeben ist
	{
		for (int i=1; i&lt;=9; i++)
		{
			if (Pruefe(TehFeld, Zeile, Spalte, i))
			{
				TehFeld[Zeile][Spalte] = i;
				if (Loese(TehFeld, n, m)) { return 1; }
			}
		}
	}
	else //wenn schon Zahl vorgegeben, direkt zum nächsten Feld
	{
		if (Loese(TehFeld, n, m)) { return 1; }
	}
	return 0;
}

void Ausgabe(sfeld Feld)
{
	for(int i=0; i &lt; 9; i++)
	{
		for(int j=0; j &lt; 9; j++)
		{
			cout &lt;&lt; Feld[i][j] &lt;&lt; &quot; &quot;;
		}
		cout &lt;&lt; endl;
	}
}
</code></pre>
<p>Ich weiß, es gibt fertige Lösungen zuhauf im Web, aber ich sitze nun schon seit Stunden hier vor meinem Code und kapier einfach nicht, warum es noch nicht funktioniert.<br />
Er beginnt zwar, Lösungen für die Felder zu suchen, irgendwo bricht er dann aber immer verfrüht ab und ich weiß nicht, wieso.<br />
Erkennt jemand den Fehler und kann mir weiterhelfen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198677/brauche-mal-hilfe-bei-backtracking-algo-sudoku</link><generator>RSS for Node</generator><lastBuildDate>Mon, 29 Jun 2026 15:31:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198677.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 24 Nov 2007 03:16:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Brauche mal Hilfe bei Backtracking Algo (Sudoku) on Sat, 24 Nov 2007 03:23:09 GMT]]></title><description><![CDATA[<p>Hallo. Ich bräuchte hier mal Hilfe bei meiner versuchten Sudoku Lösung.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

typedef int sfeld[9][9];
void Ausgabe(sfeld);
bool Loese(sfeld, int, int);
bool Pruefe(sfeld, int, int, int);

int main()
{
	sfeld Sudoku = {0,7,2,0,3,9,1,0,0,0,0,0,1,5,0,6,0,0,5,0,0,4,2,0,0,0,7,0,6,0,0,0,0,0,9,0,4,0,0,9,7,3,0,0,0,0,9,3,0,6,0,0,4,0,8,0,0,3,1,0,9,6,0,0,0,6,0,0,8,0,0,0,9,0,0,0,0,0,2,7,0};

	Ausgabe(Sudoku);

	if (!Loese(Sudoku, 0, 0))
	{
		cout &lt;&lt; &quot;Keine Lösung!&quot; &lt;&lt; endl;
	}
	cin.get();
}

bool Pruefe(sfeld TehFeld, int Zeile, int Spalte, int Wert)
{
	for (int i=0; i&lt;9; i++)
	{
		if ((Zeile != i) &amp;&amp; (Wert == TehFeld[i][Spalte])) { return 0; } //prüfen, ob der Wert in der Spalte schon enthalten ist
	}

	for (int i=0; i&lt;9; i++)
	{
		if ((Spalte != i) &amp;&amp; (Wert == TehFeld[Zeile][i])) { return 0; } //prüfen, ob der Wert in der Zeile schon enthalten ist
	}

	int k, l;
	k = (Zeile / 3);
	l = (Spalte / 3);

	for (int i = k*3; i &lt; k*3+3; i++)
	{
		for (int j = l*3; j &lt; l*3+3; j++)
		{
			if (((Zeile != i) || (Spalte != j)) &amp;&amp; (Wert == TehFeld[i][j])) { return 0; } //prüfen, ob Wert in Subquadrat schon enthalten ist
		}
	}
	return 1;
}

bool Loese(sfeld TehFeld, int Zeile, int Spalte)
{
	if (Zeile*Spalte &gt; 64) { Ausgabe(Sudoku); return 1; } //Lösung gefunden
	int n,m;
	n = Zeile;
	m = Spalte;
	n++;
	if (n &gt;= 8) { n = 0; m++; }

	if (TehFeld[Zeile][Spalte] == 0) //nur Felder bearbeiten, in denen noch keine Zahl vorgegeben ist
	{
		for (int i=1; i&lt;=9; i++)
		{
			if (Pruefe(TehFeld, Zeile, Spalte, i))
			{
				TehFeld[Zeile][Spalte] = i;
				if (Loese(TehFeld, n, m)) { return 1; }
			}
		}
	}
	else //wenn schon Zahl vorgegeben, direkt zum nächsten Feld
	{
		if (Loese(TehFeld, n, m)) { return 1; }
	}
	return 0;
}

void Ausgabe(sfeld Feld)
{
	for(int i=0; i &lt; 9; i++)
	{
		for(int j=0; j &lt; 9; j++)
		{
			cout &lt;&lt; Feld[i][j] &lt;&lt; &quot; &quot;;
		}
		cout &lt;&lt; endl;
	}
}
</code></pre>
<p>Ich weiß, es gibt fertige Lösungen zuhauf im Web, aber ich sitze nun schon seit Stunden hier vor meinem Code und kapier einfach nicht, warum es noch nicht funktioniert.<br />
Er beginnt zwar, Lösungen für die Felder zu suchen, irgendwo bricht er dann aber immer verfrüht ab und ich weiß nicht, wieso.<br />
Erkennt jemand den Fehler und kann mir weiterhelfen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1409170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1409170</guid><dc:creator><![CDATA[dorsch]]></dc:creator><pubDate>Sat, 24 Nov 2007 03:23:09 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche mal Hilfe bei Backtracking Algo (Sudoku) on Sat, 24 Nov 2007 03:45:04 GMT]]></title><description><![CDATA[<p>sfeld ist ein array und wird folglich nicht per value als Kopie übergeben. Das bedeutet aber, dass du getestete Felder manuell zurücksetzen musst, also</p>
<pre><code class="language-cpp">TehFeld[Zeile][Spalte] = i;
                if (Loese(TehFeld, n, m)) { return 1; }
                TehFeld[Zeile][Spalte] = 0;
</code></pre>
<p>würde ich jedenfalls nach einmal Überfliegen sagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1409171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1409171</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 24 Nov 2007 03:45:04 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche mal Hilfe bei Backtracking Algo (Sudoku) on Sat, 24 Nov 2007 04:22:04 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>sfeld ist ein array und wird folglich nicht per value als Kopie übergeben.</p>
</blockquote>
<p>Oh, das war mir nicht direkt bewusst. Hatte mich zwar an anderer Stelle schon gewundert, dass ich Arrays nicht explizit als Referenz übergeben konnte, aber nunja <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="😉"
    /> Ist mein erster Tag mit C/C++ heute quasi.<br />
Jedenfalls scheint es so tatsächlich zu funktionieren (wenn ich noch den Ausdruck in Zeile 55 in &quot;n &gt; 8&quot; statt &quot;n &gt;= 8&quot; ändere, my bad).</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1409172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1409172</guid><dc:creator><![CDATA[dorsch]]></dc:creator><pubDate>Sat, 24 Nov 2007 04:22:04 GMT</pubDate></item></channel></rss>