sudoku in c++

MasterOfTheDark

Grünschnabel
Code:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int s[81];//array
    int i;//laufvariable der for schleifen
    srand(time(NULL));
    for(i=0;i<81;i=i+1)
    {
                     s[i]=rand()%9+1;
    }
    //wagrecht
    for(i=0;i<9;i=i+1)//schleife wird 8 mal durchgeführt, in der schlefie wird überprüft ob es //gleiche zahlen in der selben reihe gibt
    {
                      while((s[i*9]==s[i*9+1])||(s[i*9]==s[i*9+2])||(s[i*9]==s[i*9+3])||(s[i*9]==s[i*9+4])||(s[i*9]==s[i*9+5])||(s[i*9]==s[i*9+6])||(s[i*9]==s[i*9+7])||(s[i*9]==s[i*9+8]))//schließt aus, dass die erste zahl in der zeile gleich mit allen anderen ist
                      {
                            s[i*9]=rand()%9+1;
                      }
                      while((s[i*9+1]==s[i*9])||(s[i*9+1]==s[i*9+2])||(s[i*9+1]==s[i*9+3])||(s[i*9+1]==s[i*9+4])||(s[i*9+1]==s[i*9+5])||(s[i*9+1]==s[i*9+6])||(s[i*9+1]==s[i*9+7])||(s[i*9+1]==s[i*9+8]))//schließt aus, dass die zweite zahl in der zeile gleich mit allen anderen ist, die nächsten schleifen machen genau das selbe mit der darauffolgenend zahl=>zahlen einer zeile sidn immer unterschiedlich
                      {
                            s[i*9+1]=rand()%9+1;
                      }
                      while((s[i*9+2]==s[i*9+1])||(s[i*9+2]==s[i*9])||(s[i*9+2]==s[i*9+3])||(s[i*9+2]==s[i*9+4])||(s[i*9+2]==s[i*9+5])||(s[i*9+2]==s[i*9+6])||(s[i*9+2]==s[i*9+7])||(s[i*9+2]==s[i*9+8]))  
                      {
                            s[i*9+2]=rand()%9+1;
                      }
                      while((s[i*9+3]==s[i*9])||(s[i*9+3]==s[i*9+1])||(s[i*9+3]==s[i*9+2])||(s[i*9+3]==s[i*9+4])||(s[i*9+3]==s[i*9+5])||(s[i*9+3]==s[i*9+6])||(s[i*9+3]==s[i*9+7])||(s[i*9+3]==s[i*9+8]))  
                      {
                            s[i*9+3]=rand()%9+1;
                      }
                      while((s[i*9+4]==s[i*9])||(s[i*9+4]==s[i*9+1])||(s[i*9+4]==s[i*9+2])||(s[i*9+4]==s[i*9+3])||(s[i*9+4]==s[i*9+5])||(s[i*9+4]==s[i*9+6])||(s[i*9+4]==s[i*9+7])||(s[i*9+4]==s[i*9+8]))  
                      {
                            s[i*9+4]=rand()%9+1;
                      }
                      while((s[i*9+5]==s[i*9])||(s[i*9+5]==s[i*9+1])||(s[i*9+5]==s[i*9+2])||(s[i*9+5]==s[i*9+3])||(s[i*9+5]==s[i*9+4])||(s[i*9+5]==s[i*9+6])||(s[i*9+5]==s[i*9+7])||(s[i*9+5]==s[i*9+8]))  
                      {
                            s[i*9+5]=rand()%9+1;
                      }
                      while((s[i*9+6]==s[i*9])||(s[i*9+6]==s[i*9+1])||(s[i*9+6]==s[i*9+2])||(s[i*9+6]==s[i*9+3])||(s[i*9+6]==s[i*9+4])||(s[i*9+6]==s[i*9+5])||(s[i*9+6]==s[i*9+7])||(s[i*9+6]==s[i*9+8]))  
                      {
                            s[i*9+6]=rand()%9+1;
                      }
                      while((s[i*9+7]==s[i*9])||(s[i*9+7]==s[i*9+1])||(s[i*9+7]==s[i*9+2])||(s[i*9+7]==s[i*9+3])||(s[i*9+7]==s[i*9+4])||(s[i*9+7]==s[i*9+5])||(s[i*9+7]==s[i*9+6])||(s[i*9+7]==s[i*9+8]))  
                      {
                            s[i*9+7]=rand()%9+1;
                      }
                      while((s[i*9+8]==s[i*9])||(s[i*9+8]==s[i*9+1])||(s[i*9+8]==s[i*9+2])||(s[i*9+8]==s[i*9+3])||(s[i*9+8]==s[i*9+4])||(s[i*9+8]==s[i*9+5])||(s[i*9+8]==s[i*9+6])||(s[i*9+8]==s[i*9+7]))  
                      {
                            s[i*9+8]=rand()%9+1;
                      }
    }
    //wagrecht sollte unterschiedlich sein
    printf("%d %d %d %d %d %d %d %d %d  \n",s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[9],s[10],s[11],s[12],s[13],s[14],s[15],s[16],s[17]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[18],s[19],s[20],s[21],s[22],s[23],s[24],s[25],s[26]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[27],s[28],s[29],s[30],s[31],s[32],s[33],s[34],s[35]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[36],s[37],s[38],s[39],s[40],s[41],s[42],s[43],s[44]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[45],s[46],s[47],s[48],s[49],s[50],s[51],s[52],s[53]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[54],s[55],s[56],s[57],s[58],s[59],s[60],s[61],s[62]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[63],s[64],s[65],s[66],s[67],s[68],s[69],s[70],s[71]);
    printf("%d %d %d %d %d %d %d %d %d  \n\n\n\n",s[72],s[73],s[74],s[75],s[76],s[77],s[78],s[79],s[80]);
    //senkrecht
    for(i=0;i<9;i=i+1)
    {
                      while((s[i+9]==s[i])||(s[i+9]==s[i+18])||(s[i+9]==s[i+27])||(s[i+9]==s[i+36])||(s[i+9]==s[i+45])||(s[i+9]==s[i+54])||(s[i+9]==s[i+63])||(s[i+9]==s[i+72]))//erste zahl einer spalte ist unterschiedlich mit den anderen
                      {
                            s[i+9]=rand()%9+1;
                      }
                      while((s[i+18]==s[i])||(s[i+18]==s[i+9])||(s[i+18]==s[i+27])||(s[i+18]==s[i+36])||(s[i+18]==s[i+45])||(s[i+18]==s[i+54])||(s[i+18]==s[i+63])||(s[i+18]==s[i+72]))//2.zahl einer spalte ist unterschiedlich mit den anderen usw...
                      {
                            s[i+18]=rand()%9+1;
                      }
                      while((s[i+27]==s[i])||(s[i+27]==s[i+9])||(s[i+27]==s[i+18])||(s[i+27]==s[i+36])||(s[i+27]==s[i+45])||(s[i+27]==s[i+54])||(s[i+27]==s[i+63])||(s[i+27]==s[i+72]))
                      {
                            s[i+27]=rand()%9+1;
                      }
                      while((s[i+36]==s[i])||(s[i+36]==s[i+9])||(s[i+36]==s[i+18])||(s[i+36]==s[i+27])||(s[i+36]==s[i+45])||(s[i+36]==s[i+54])||(s[i+36]==s[i+63])||(s[i+36]==s[i+72]))
                      {
                            s[i+36]=rand()%9+1;
                      }
                      while((s[i+45]==s[i])||(s[i+45]==s[i+9])||(s[i+45]==s[i+18])||(s[i+45]==s[i+27])||(s[i+45]==s[i+36])||(s[i+45]==s[i+54])||(s[i+45]==s[i+63])||(s[i+45]==s[i+72]))
                      {
                            s[i+45]=rand()%9+1;
                      }
                      while((s[i+54]==s[i])||(s[i+54]==s[i+9])||(s[i+54]==s[i+18])||(s[i+54]==s[i+27])||(s[i+54]==s[i+36])||(s[i+54]==s[i+45])||(s[i+54]==s[i+63])||(s[i+54]==s[i+72]))
                      {
                            s[i+54]=rand()%9+1;
                      }
                      while((s[i+63]==s[i])||(s[i+63]==s[i+9])||(s[i+63]==s[i+18])||(s[i+63]==s[i+27])||(s[i+63]==s[i+36])||(s[i+63]==s[i+45])||(s[i+63]==s[i+54])||(s[i+63]==s[i+72]))
                      {
                            s[i+63]=rand()%9+1;
                      }
                      while((s[i+72]==s[i])||(s[i+72]==s[i+9])||(s[i+72]==s[i+18])||(s[i+72]==s[i+27])||(s[i+72]==s[i+36])||(s[i+72]==s[i+45])||(s[i+72]==s[i+54])||(s[i+72]==s[i+63]))
                      {
                            s[i+72]=rand()%9+1;
                      }
                      
    }               
    //senkrecht sollte unterschiedlich sein  
    printf("%d %d %d %d %d %d %d %d %d  \n",s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[9],s[10],s[11],s[12],s[13],s[14],s[15],s[16],s[17]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[18],s[19],s[20],s[21],s[22],s[23],s[24],s[25],s[26]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[27],s[28],s[29],s[30],s[31],s[32],s[33],s[34],s[35]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[36],s[37],s[38],s[39],s[40],s[41],s[42],s[43],s[44]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[45],s[46],s[47],s[48],s[49],s[50],s[51],s[52],s[53]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[54],s[55],s[56],s[57],s[58],s[59],s[60],s[61],s[62]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[63],s[64],s[65],s[66],s[67],s[68],s[69],s[70],s[71]);
    printf("%d %d %d %d %d %d %d %d %d  \n",s[72],s[73],s[74],s[75],s[76],s[77],s[78],s[79],s[80]);
    system("PAUSE");
    return EXIT_SUCCESS;
}

nun hab ich das problem, dass ich nicht weiß, wie ich das ganze zu einem "richtigen" sudoku zusammenfüge(ohne die regel, dass in jedem 3x3 quadrat jede zahl nur einmal vorkommen darf)
lg masterOfTheDark ;-)
 
Zuletzt bearbeitet:
Hallo!
Also ich weiß nicht, vielleicht bin ich ja zu dumm, aber ich werde aus deinem Code nicht schlau, obwohl dass was er erzeugt zumal nicht schlecht aussieht! Könnest du deinen Code vielleicht nochmal etwas genauer erläutern und erklären, was genau die Schleifen machen, werde nämlich wirklich nicht daraus schlau, vielleicht kann ich dir dann helfen, und was meinst du mit "richtigem" Sudoku?
Da ich mich auch mal mit Sudokus befasst habe / befasse (Lösungsalorithmen), sag ich einfach mal was dazu:
Besser wäre es, wenn du ein 2 dimensionales Array anlegst also z.B. feld[x][y]
Dann könntest du auch viel einfacher das mit den Quadraten einbauen!

//Edit: Ich denke, am einfachsten wäre es, wenn man eine Funktion schreibt, die rekursiv agiert (Sich selbst aufruft) ! Falls du nicht weißt wie das gehen soll , sag mir bescheid :)
 
Zuletzt bearbeitet:
ich werd das heute mit einem 2dimensionalen array mal versuchen

in einem richtigen sudoku sind ja in jedem 3x3 feld,jedr spalte und jeder zeile immer die zahlen 1-9, das 3x3 feld ist mir jz noch egal, ich versuche mal nur das die regeln mit den spalten und zeilen stimmt, was mit oben eigentlich gelungen ist, aber wenn ich die ausgabe nach der 1. for schleife weglasse stimmen weder die reihen noch die spalten:confused:

lg MasterOfTheDark

PS:erklärung der schleifen stehen im code oben drin(reineditiert)
 
So, bin jetzt fertig, habe aber ein bestimmtes System hinter diesem Algorithmus, d.h. erst muss ich dir ein paar Sachen dazu erzählen:
Mein Sudoku funktioniert so :
Ich habe die 9 Quadrate einfach von 0 bis 8 durchnummeriert.
Und die x Koordinate auch von 0 bis 8 , genauso wie die y - Koordinate.
Hier ein Bild zum besseren verständnis:
http://legende.le.ohost.de/sudoku_system.jpg
Ja, und hier der Code, wenn du fragen hast, dann schreib einfach :)
Der ist jetzt in C , das macht ja kein Unterschied, du musst einfach nur deine Includs ändern!
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int feld[9][9];

//In welchem quadrat liegt das feld mit den koordinaten x und y?
int welches_quadrat(int x,int y) {
    int quadrat;
    if(x >= 0 && x<=2 && y>= 0 && y<=2) quadrat=0;
    if(x >= 0 && x<=2 && y>= 3 && y<=5) quadrat=3;
    if(x >= 0 && x<=2 && y>= 6 && y<=8) quadrat=6;
    
    if(x >= 3 && x<=5 && y>= 0 && y<=2) quadrat=1;
    if(x >= 3 && x<=5 && y>= 3 && y<=5) quadrat=4;
    if(x >= 3 && x<=5 && y>= 6 && y<=8) quadrat=7;
    
    if(x >= 6 && x<=8 && y>= 0 && y<=2) quadrat=2;
    if(x >= 6 && x<=8 && y>= 3 && y<=5) quadrat=5;
    if(x >= 6 && x<=8 && y>= 6 && y<=8) quadrat=8;

    return quadrat;
}

//Ist die Zahl im quadrat schon vorhanden?
int vorhanden_quadrat (int quadrat,int zahl)
{
	int xBegin,yBegin,exists = 0;
	switch(quadrat) {
		case 0: xBegin = 0; yBegin = 0; break;
		case 1: xBegin = 3; yBegin = 0; break;
		case 2: xBegin = 6; yBegin = 0; break;
		case 3: xBegin = 0; yBegin = 3; break;
		case 4: xBegin = 3; yBegin = 3; break;
		case 5: xBegin = 6; yBegin = 3; break;
		case 6: xBegin = 0; yBegin = 6; break;
		case 7: xBegin = 3; yBegin = 6; break;
		case 8: xBegin = 6; yBegin = 6; break;
	}

	//Proves if Number already exists in this square
	for (int y = yBegin; y <= (yBegin + 2) ; y++) {
		for (int x = xBegin ; x <= (xBegin + 2) ; x++) {
			if (zahl == feld[x][y]) exists = 1;
		}
	}
	return exists;
}

//ist die zahl in der zeile y schon vorhanden?
int vorhanden_zeile(int y,int zahl) {
    int vorhanden = 0;
    for(int i=0;i<=8;i++) {
            if(feld[i][y]==zahl) vorhanden = 1;
    }
	return vorhanden;
}

//ist die zahl in der zeile x schon vorhanden?
int vorhanden_spalte(int x,int zahl) {
    int vorhanden = 0;
    for(int i=0;i<=8;i++) {
            if(feld[x][i]==zahl) vorhanden = 1;
    }
	return vorhanden;
}

//Schreibt eine Zahl in das Feld mit den einer bestimmten x und y koordinate
int zahl_erzeugen(int x,int y) {
    //Zufallszahl zwischen 1 und neun generieren
    int zufallszahl = rand()%9+1;
    //Schauen in welchem Quadrat das Feld liegt.
    int quadrat = welches_quadrat(x,y);
    
    if(vorhanden_quadrat(quadrat,zufallszahl) == 0 && vorhanden_spalte(x,zufallszahl)==0 && vorhanden_zeile(y,zufallszahl==0) ) return zufallszahl;
    else return zahl_erzeugen(x,y);
}

//sudoku ausgeben
void show(void)
{
	int x,y;
	printf("\n");
	for(y=0;y<=8;y++)
	{
		
		if (y%3 == 0 && y != 0) printf("-----------\n");

		for(x=0;x<=8;x++)
		{
			
			if (x%3 == 0 && x!=0) printf("|");
			

			printf("");
			if(feld[x][y] == 0) printf(" ");
			else printf("%i",feld[x][y]);
			printf("");
		}

		//Neue Zeile
		printf("\n");
		
	}
}

int main(int argc,char *argv[]) {
    srand(time(NULL));
    //Schleife für y-Koordinaten
    for(int y=0;y<9;y++){
            //Schleife für x-Koordinaten
            for(int x=0;x<9;x++) {
                    feld[x][y]=zahl_erzeugen(x,y);
            }
    }
    
    show();
    
    
    system("pause");
    return 0;
}

//Edit: Hier wird sogar die Quadratregel beachtet ;)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück