Sudoku Solver // habe probleme



  • Hallo an alle!

    hab ein problem mit meinem sudoku löser..
    hab die letzten paar tage ein bisschen was zusammegeschrieben,
    aber es funktioniert nicht...
    es gibt zwar schon viele threads zu diesem thema, jedoch möchte ich gerne meine eigene version zum laufen bekommen.. 😞

    ich weiss nicht ganz wie ich das mit dem auflösen zusammenbringen soll
    der fehler liegt im main, und zwar bei aufraufen der check funktion bzw. bei der if-bedingung die auf 10 abfrägt.
    wenn ein ungültiger wert entsteht, spring er eins zurück. Das macht er solange bis er wieder zum ursprung kommt, und anschließen noch weiter..

    hier noch ein test-sudoko das man in eine txt datei schreiben kann

    000006000
    028900607
    639578000
    500760100
    700154060
    201803400
    007600030
    002009000
    000080000

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    int rauslesen(FILE *datei, char **zahlen);
    int rauslesen(FILE *datei, char **zahlen)
    {
    	char temp;
    	int size=0, k=0;
    
    	fseek(datei,0,SEEK_SET);
    	while(!feof(datei))
    	{
    		temp=fgetc(datei);	
    		zahlen[size]=(char *)realloc(zahlen[size],sizeof(char)*(k+1));
    		zahlen[size][k]=temp; k++;
    		zahlen[size][k]='\0';
    
    		if(temp==10)
    		{ 
    			size++;
    			zahlen=(char **)realloc(zahlen,sizeof(char *)*(size+1));
    			zahlen[size]=(char *)malloc(sizeof(char));
    			k=0;
    		}
    	}
    	return size;
    }
    
    void transformers2(char **data, int size);
    void transformers2(char **data, int size)
    {
    	for(int ctp=0;ctp<size;ctp++)
    		for(int ctp2=0;ctp2<size;ctp2++)
    			data[ctp][ctp2]=data[ctp][ctp2]-48;	
    }
    
    void display_sudoku(char **data, int size);
    void display_sudoku(char **data, int size)
    {
    	for(int ctp=0;ctp<size;ctp++)
    	{
    		if((ctp)%3==0 && ctp>0)
    		{
    			printf("\n");
    			for(int k=0;k<size+6;k++)
    			{
    				if(k==4 || k==10)
    					printf("%c",197);
    				else
    					printf("%c",196);
    			}
    		}
    		for(int ctp2=0;ctp2<size;ctp2++)
    		{
    			if(ctp2==0)
    				printf("\n");
    			if(ctp2%3==0 && ctp2>0)
    				printf(" %c ",179);	
    			if(data[ctp][ctp2]==0)
    				printf("%c",88);
    			else
    			printf("%d",data[ctp][ctp2]);
    		}
    	}
    	printf("\n\n");
    }
    
    bool check(char **data, int y, int x, int size);
    bool check(char **data, int y, int x, int size)
    {
    	int temp=0;	
    	int spalten=x/3*3;
    	int zeilen=y/3*3;
    
    	// BLOCK
    	for(int k=0;k<3;k++)
    	{
    		for(int i=0;i<3;i++)
    		{
    			if(data[y][x]==data[zeilen+k][spalten+i])
    				temp++;
    			if(temp>1)
    				return false;
    		}
    	}	temp=0;
    
    	// HORIZONTAL
    	for(int ctp=0;ctp<size;ctp++)
    	{
    		if(data[y][x]==data[y][ctp])
    			temp++;
    			if(temp>1)
    			return false;
    	}	temp=0;
    
    	// VERTIKAL
    	for(int ctp=0;ctp<size;ctp++)
    	{
    		if(data[y][x]==data[ctp][x])
    			temp++;
    			if(temp>1)
    			return false;
    	}	temp=0;
    	return true;
    }
    
    bool solver(char **data, int size, int position);
    bool solver(char **data, int size, int position)
    {
    
    	return NULL;
    }
    
    void main()
    {
    	int size=0;
    	int wert=1;
    	int merker=1;
    	int temp=1;
    	char **zahlen;
    
    	FILE *datei;
    	datei=fopen("su1.txt","r");
    
    	zahlen=(char **)malloc(sizeof(char *));
    	zahlen[0]=(char *)malloc(sizeof(char));
    
    	if(datei!=NULL)
    	{
    		size=rauslesen(datei,zahlen);
    		transformers2(zahlen,size);
    		display_sudoku(zahlen,size);
    
    		for(int k=0;k<size;k++)
    		{
    			for(int i=0;i<size;i++)
    			{
    				if(wert==10)
    				{
    					int g;
    					display_sudoku(zahlen,size);
    					temp++;					
    					wert=zahlen[k][i-temp];
    					for(g=0;g<(temp+1);g++)
    						zahlen[k][8-g]=0;
    					display_sudoku(zahlen,size);
    					i=i-(g+1);
    					wert++;				
    				}
    				if(zahlen[k][i]==0)
    				{
    					zahlen[k][i]=wert;
    					display_sudoku(zahlen,size);
    					if(check(zahlen,k,i,size))
    					{
    						display_sudoku(zahlen,size);
    						zahlen[k][i]=wert;
    						wert=1;
    					}
    					else
    					{
    						zahlen[k][i]=0;
    						display_sudoku(zahlen,size);
    						i--;
    						wert++;
    					}
    				}
    			}
    		}
    		display_sudoku(zahlen,size);
    	}
    	else
    		perror("");
    
    	free(zahlen);
    	getch();
    }
    

    danke!



  • einfach mal nen debugger verwenden



  • das hat recht wenig mit c++ zutun genau genommen sieht das nach c aus 😉
    gehört also nicht hier rein
    kleiner tipp du brauchst die prototypen nicht direkt vor der funktion deklarieren
    wenn dann alle ganz an den anfang aber nach deinem aufbau brauchst du diese garnicht
    und bei logig fehler oder generell bei fehler hielft der debuger
    einfach den cod zeiel für zeile mim debuger durchgehen



  • Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten