Problem mit " 8 Damen Problem "



  • Hallo
    Habe ein Problem mit meinem Programm, welches das " 8 Damen Problem " lösen soll.

    Der Algorithmus ist relativ einfach mit Backtracking gemacht, leider funktioniert das Programm nicht wirklich.

    Wäre echt super wenn mal jemand drüber schauen könnte.

    Hier ist der Code :

    #include <stdio.h>
    #define MAX 50
    
    int schachbrett_[MAX][MAX];    //globale Variablen
    int zeile_, spalte_,groesse_;
    
    //INITIALISIERUNG
    void initProgram ()
    {
    int i,j;	//Laufvariablen Arrayinitialisierung
    
    	for(i=0;i>=MAX;i++)		//Initialisierung Array
    	{
    		for(j=0;j>=MAX;j++)
    		{
    			schachbrett_[i][j]=0;
    		}
    	}
    
    	//restliche Initialisierung
    
    	zeile_=0;
    	spalte_=0;
    	groesse_=0;
    }
    
    //EINGABEFUNKTION GROESSE SCHACHBRETT
    int eingabeGroesse ()
    {
    	int eingabe = 1;
    	int groesse;
    
    	printf("\n\nErklaerung: Das Programm erstellt ein Schachbrett mit der von Ihnen eingegebenen Groesse (max. 50) und probiert in jede Spalte eine Dame zu setzen, mit der Bedingung das sich die Damen nicht schlagen koennen\n\n\n\n");
    
    	while(eingabe) 					
      		{
    			printf("Geben sie die Groesse des Schachbrettes an (zwischen 1 und 50):");
      			scanf("%i", &groesse);
    
      				if((groesse>MAX)|(groesse<1))		
       					{
       					printf("Falsche Eingabe, erneut eingeben\n\n");
        				eingabe=1;
       					}
    
    				else
       					{
       					eingabe=0;
       					}
    
      		}
    
    	return groesse;
    }
    
    //FUNKTION ZUM SETZEN EINES WERTES IM ARRAY
    void setzeDame(int zeile, int spalte)
    {
    	schachbrett_[zeile][spalte]=1;	
    	ausgabeStdio(groesse_);
    	printf("\n\n\n");
    	getchar();
    }
    
    //FUNKTION ZUM BESTIMMEN DER POSITION EINER DAME IN EINER SPALTE
    int posiDame(int spalte)
    {
    	int i;	//Laufvariable
    	int posi;
    
    		for(i=0; i<=groesse_; i++)
    		{
    			if(schachbrett_[i][spalte]==1)
    			{
    			posi=i;
    			}
    			else
    			{
    			printf("keine Position gefunden");
    			}
    		}
    	return posi;
    
    }
    
    //FUNKTION ZUM LÖSCHEN EINER DAME
    
    void removeDame (int spalte, int zeile)
    {
    	schachbrett_[zeile][spalte]=0;
    }
    
    //FUNKTION ZUM ERMITTELN EINES KONFLIKTES BEIM SETZEN EINER DAME
    
    int conflictFeld (int spalte, int zeile)
    {
    	int i; //Laufvariable
    	int status; //Statusvar. wenn 1 konflikt wenn 0 Dame kann gesetzt werden
    	int zahl = 0;
    
    	for (i=0; i<=groesse_; i++)
    	{
    
    		if((schachbrett_[zeile][i]==1)&&(i!=spalte)) //Zeile	
    		{
    		status=1;
    		}
    		else if(((spalte-i)>=0)&&((zeile-i)>=0)&&(schachbrett_[zeile-i][spalte-i]==1))//Diagonale links hinauf
    		{
    		status=1;
    		}
    		else if(((spalte-i)>=0)&&((zeile+i)<=groesse_)&&(schachbrett_[zeile+i][spalte-i]==1))//Diagonale links hinunter
    		{
    		status=1;
    		}
    		else if(((spalte+i)<=groesse_)&&((zeile-i)>=0)&&(schachbrett_[zeile-i][spalte+i]==1))//Diagonale rechts hinauf
    		{
    		status=1;
    		}
    		else if(((spalte+i)<=groesse_)&&((zeile+i)<=groesse_)&&(schachbrett_[zeile+i][spalte+i]==1))//Diagonale rechts hinunter
    		{
    		status=1;
    		}
    		else
    		{
    		zahl=zahl+1;
    		status=0;
    		printf("kein konflikt %i\n", zahl);
    
    		}
    
    	}
    	return status;
    }
    
    //FUNKTION ZUR AUSGABE IM STDIO
    int ausgabeStdio(int seitenlaenge)
    {
    	int i,j;		//Laufvariablen
    
    	for (i=0;i<=(seitenlaenge-1);i++)		//Durchlauf Spalte
    	{
    		printf("\n");						//Neue Zeile
    
    		for (j=0;j<=(seitenlaenge-1);j++)	//Durchlauf Zeile
    		{
    		printf("|%4i|",schachbrett_[i][j]);
    		}
    	}
    
    }
    
    //HAUPTPROGRAMM
    int main()
    
    {
    
    	initProgram();							//Initialisierung
    	groesse_=eingabeGroesse();				//Eingabe Groesse
    
    	zeile_=0;								//Startposition
    	spalte_=0;
    
    	//Algorithmus
    
    	while ((spalte_>=0)&&(spalte_<=groesse_))
    	{
    
    		while ((zeile_<groesse_) && conflictFeld(zeile_,spalte_))
    		{
    			zeile_=zeile_+1;
    
    			if(zeile_<groesse_)
    			{
    			setzeDame(zeile_,spalte_);
    			spalte_=spalte_+1;
    			zeile_=0;
    			}
    
    			else
    			{
    			spalte_=spalte_-1;
    			zeile_=posiDame(spalte_);
    			removeDame(zeile_,spalte_);
    			zeile_=zeile_+1;
    			}
    		}
    	}
    
    	if(spalte_>=groesse_)
    	{
    	printf("Es gibt eine Loesung\n\n\n");
    	ausgabeStdio(groesse_);
    	}
    	else
    	{
    	printf("Es gibt keine Loesung");
    	}
    
    }
    


  • conflictFeld liefert immer

    return 1;
    


  • Oh das ist noch falsch drinnen.

    Soll natürlich " return status " heißen.

    Hatte den 1er nur zur Fehlersuche mal drinnen.
    Habs jetzt editiert.

    Das Programm bleibt immer bei " kein Konflikt " in einer Endlos Schleife hängen und ich weiß nicht recht warum.



  • Am Ende der ersten while Schleife fehlt noch

    ++spalte_;
    

    o.ä.



  • Du vergleichst auch immer mit <= groesse_
    Wenn groesse_ = 8 ist hast du aber 9 Elemente.
    Wenn groesse_ = 50 greifst du irgendwann auf z.B. schachbrett_[0][50]; zu. Dieses Element existiert aber nicht.



  • for(i=0;i>=MAX;i++)
    

    sieht auch irgendwie ungesund aus.
    Das wird auch prinzipiellso nichts. Du musst spalten/zeilen-weise zurücksetzen und nicht feldweise.
    Es gibt genau 92 Lösungen für ein Standard-8x8 Schachbrett.


Anmelden zum Antworten