# Verschachtelte for-Schleifen



## XxbambamxX (9. Juni 2010)

Hi zusammen.
Ich möchte gerne 81 Verschachtelte for-Schleifen.
also etwa so:

```
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 !
Hat jemand von euch eine Idee wie man das Lösen könnte? (Vielleicht mit einer Rekursiven Funktion?)
Ich habe bereits Folgendes Probiert:

```
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


----------



## deepthroat (10. Juni 2010)

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ß


----------



## vfl_freak (10. Juni 2010)

manche Leute haben eben Zeit .....


----------



## Cromon (10. Juni 2010)

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 )


----------



## FrankBooth (10. Juni 2010)

Mich würde mal interessieren, was man überhaupt mit 81 for-Schleifen machen will?


----------



## deepthroat (10. Juni 2010)

FrankBooth hat gesagt.:


> 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... 

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ß


----------



## FrankBooth (10. Juni 2010)

Und wieder zeigt sich, Mathe ist der Chef


----------



## Sebastian29 (10. Juni 2010)

Hi!

Kein Kommentar! 


```
/* 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


----------



## Cromon (10. Juni 2010)

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?


----------



## Bratkartoffel (10. Juni 2010)

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


----------



## Sebastian29 (10. Juni 2010)

Sorry, ich hätte noch dazu schreiben müssen, dass der Source-Code nicht von mir kommt, sondern ich habe ihn über Google gefunden, dass einer auch so verrückt mit tausenden Schleifen programmiert hat. 

Hier: http://www.sourcecodesworld.com/source/show.asp?ScriptID=1111

Gruß
Sebastian29


----------



## XxbambamxX (10. Juni 2010)

Hi leute
erstmal Danke für alle sinvolle Beiträge.


> 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...


Das mit dem Sudoku habe ich mittlerweile mit einer etwas ausgeklügelteren Methode, was eigentlich nicht weiter schwer ist , gelöst.
Bei diesem Beitrag hier, ging es mir um ein anderes Logikspiel namens Kakuro. Bei dem Beispiel das ich ausgeschnitten hatte, gab es genau 81 Felder. War also mehr oder weniger Zufall. Da bei diesem Spiel nicht alle Zahlen zwingend gleich häufig vorkommen, müsste die Bruteforce Methode eben so aussehen. Aber vielen Dank für den Tipp mit den Anordnungen.


> über eine Dezillion (eine 1 mit 60 Nullen) Jahre dauern würde


Jap da hab ich wohl zu wenige Gedanken an die Rechenzeit vergebeb^^
Ich dachte so an n paar Stunden und gut ists


----------

