Verschachtelte for-Schleifen

XxbambamxX

Mitglied
Hi zusammen.
Ich möchte gerne 81 Verschachtelte for-Schleifen.
also etwa so:
Code:
for(int a=0;a<9;a++)
{
for(int b=0;b<9;b++)
{
for(int c=0;c<9;c++)
........
}
}
}

So stelle ich mir das vor.. =)
Allerdings bin ich zu Faul um mir ganze 81 For-Schleifen zu Scripten und das Ganze wird dadurch auch nicht unbedingt übersichtlicher :D!
Hat jemand von euch eine Idee wie man das Lösen könnte? (Vielleicht mit einer Rekursiven Funktion?)
Ich habe bereits Folgendes Probiert:
Code:
int x=0;
int Verschachtelung()
{
x++;
for(int i=0;i<9;i++)
{
if(x<81)
Verschachtelung();
}

return 0;
}
Allerdings Funktioniert dies (aus für mich Unerklärlichen gründen) nicht. Tests von mir haben ergeben, dass nur die 81 For-Schleife vollständig durchlaufen wird, Alle anderen werden nur 1mal aufgerufen und dann gleich weiterverzweigt =(
Für Fehlersuchende, Tippgeber und Ideengeber bin ich sehr dankbar!
mfg
 
Hi.

Bist du dir im Klaren darüber, das 81 verschachtelte for-Schleifen mit je 9 Iterationen insgesamt 9^81 (also 196627050475552913618075908526912116283103450944214766927315415537966391196809) Iterationen benötigen und das dies (bei optimistischer Schätzung) von 1 Iteration pro CPU Zyklus und einer 4 GHz CPU über eine Dezillion (eine 1 mit 60 Nullen) Jahre dauern würde?

Gruß
 
Oder aber sie haben einfach eine verdammt schnelle Maschine! (So im Bereich 10^75 Hz Prozessor, dann ists so in ca einer halben Stunde durch :p)
 
Mich würde mal interessieren, was man überhaupt mit 81 for-Schleifen machen will?
Man stelle sich vor man hat ein Sudoku mit 9x9 Feldern. Jedes dieser Felder kann den Wert 1 bis 9 annehmen. Wollte man jetzt alle möglichen (und bzgl. der Sudoku-Regeln auch unmöglichen) Variationen durchspielen könnte man erstmal auf naive Weise alle Variationen ausrechnen wollen... :-)

Warum XxbambamxX nun ausgerechnet so einen Ansatz wählt wo er/sie vorher in einem anderen Thema ausdrücklich keine Brute-Force-Methode verwenden wollte ist mir schleierhaft... :confused:

Ein Sudoku ist im Grunde lediglich eine Anordnung (Permutation) von 81 Elementen (9 * 1, 9 * 2, 9 * 3 usw.). Da würde es ja reichen alle Permutationen zu bestimmen um zu einer Lösung zu kommen. Davon gibt es nämlich auch bedeutend weniger ;)

Gruß
 
Hi!

Kein Kommentar! :D

PHP:
/* SU DOKU */

#include <iostream.h>
void main()
{
	int k[9][9],K[9][9];
	int i,j,i1,j1,i2,j2;
	int error,temp;
	int count=0;

	for(i=0;i<9;i++)
	for(j=0;j<9;j++)
		K[i][j]=0;

	for(i=0;i<9;i++)
	for(j=0;j<9;j++)
	{
		cin>>K[i][j];
		k[i][j]=K[i][j];
	}
	cout<<"O.K.? (Enter 0 if OK, 1 to update): ";
	cin>>error;
	if(error==0)
		goto matrixvalidation;

matrixupdation:
	while(1)
	{
		cout<<"Enter Row, Col, Revised number:(0 to exit) ";
		cin>>i;
		if(i==0)break;
		cin>>j>>temp;
		if(i>0&&j>0&&temp>=0&&i<10&&j<10&&temp<10)
		{
			K[i-1][j-1]=temp;
			k[i-1][j-1]=temp;
		}
		else
			cout<<"Enter row/column 1 to 9 & number 0 to 9 only.
";
	}

matrixvalidation:
	cout<<"
Input matrix:
";
	for(i=0;i<9;i++)
	{
		for(j=0;j<9;j++)
			cout<<k[i][j]<<" ";
		cout<<"
";
	}

	for(i=0;i<9;i++)
	for(j=0;j<9;j++)
		if(k[i][j]<0||k[i][j]>9)
		{
			cout<<"
"<<i+1<<" "<<j+1<<" "<<k[i][j];
			cout<<"
Input matrix error.";
			cout<<"
Numbers should be 1 to 9 only.

";
			goto matrixupdation;
		}

	for(i=0;i<9;i++)
	for(j=0;j<9;j++)
	{
		if(k[i][j]==0)continue;
		error=0;
		for(i1=0;i1<9;i1++)
			if(i!=i1&&k[i][j]==k[i1][j])
			{
				error=1;
				i2=i1;
				j2=j;
			}
		for(j1=0;j1<9;j1++)
			if(j!=j1&&k[i][j]==k[i][j1])
			{
				error=1;
				i2=i;
				j2=j1;
			}
		for(i1=0;i1<9;i1++)
		for(j1=0;j1<9;j1++)
			if((i!=i1||j!=j1)&&i/3==i1/3&&j/3==j1/3&&k[i][j]==k[i1][j1])
			{
				error=1;
				i2=i1;
				j2=j1;
			}
		if(error)
		{
			cout<<"
"<<i+1<<" "<<j+1<<" "<<k[i][j];
			cout<<"
"<<i2+1<<" "<<j2+1<<" "<<k[i2][j2];
			cout<<"
Input matrix error.";
			cout<<"
A number has been repeated in the same row, col or
block.

";
			goto matrixupdation;
		}
	}

/* Logic starts: */
	for(i=0;i<9;i++)
	for(j=0;j<9;j++)
	{
		if(K[i][j]>0) goto chksol;
		for(k[i][j]++;k[i][j]<=9;k[i][j]++)
		{
			error=0;
			for(i1=0;i1<9;i1++)
				if(i!=i1&&k[i][j]==k[i1][j])error=1;
			for(j1=0;j1<9;j1++)
				if(j!=j1&&k[i][j]==k[i][j1])error=1;
			for(i1=0;i1<9;i1++)
			for(j1=0;j1<9;j1++)
				if((i!=i1||j!=j1)&&i/3==i1/3&&j/3==j1/3&&k[i][j]==k[i1][j1])
					error=1;
			if(error==0)break;
		}
		if(k[i][j]>9)
		{
			k[i][j]=0;
			do
			{
				if(i==0&&j==0)goto nomoresol;
				if(j>0)j--;else{j=8;i--;}
			}while(K[i][j]>0);
			j--;
		}
chksol:	if(i==8&&j==8)
		{
			cout<<"
Solution: "<<++count<<"
";
			for(i1=0;i1<9;i1++)
			{
				for(j1=0;j1<9;j1++)
					cout<<k[i1][j1]<<" ";
				cout<<"
";
			}
			if(count==50)
			{
				cout<<"
Too many solutions.
Not checking for more 
solutions.

";
				return;
			}

			while(K[i][j]>0)
			{
				if(i==0&&j==0)goto nomoresol;
				if(j>0)j--;else{j=8;i--;}
			}
			k[i][j]=0;
			do
			{
				if(i==0&&j==0)goto nomoresol;
				if(j>0)j--;else{j=8;i--;}
			}while(K[i][j]>0);
			j--;
		}
	}
nomoresol:
	if(count>0)
		cout<<"
No more solutions.

";
	else
		cout<<"No solution.

";
}

Gruß
Sebastian29
 
Ohne jetzt deinen Code genauer anzuschauen:
- Du weisst, dass Funktionen gibt? Man braucht keine Labels mehr (man verwendet sie eigentlich auch kaum mehr).

- Du weisst, dass main einen Integer zurückgeben soll und nicht void?

- if(j>0)j--;else{j=8;i--;} Schlimmer gehts nimmer?
 
Jo, der Source Code sieht übel aus ;)
Ergänzung (zum Thema mnemonische Variablen / ohne Kommentare): int k[9][9],K[9][9];

Werde es aber trotzdem mal testen, mal schauen ob / wie es geht ;)

Gruß
BK
 
Zurück