Sudoku-Rätsel lösen lassen



  • Sieht ja recht interessant aus, aber auch recht kompliziert für den Anfang, oder?

    Wie findest du denn meinen Ansatz? Kann man daraus noch was machen oder hab ich gleich ganz falsch angefangen und erzähl die ganze Zeit nur Blödsinn? 😃

    Werd mir die Seite aus alle Fälle merken!



  • Goldienator schrieb:

    Hi Leute!

    Denke, Du solltest erstmal kleinere Probleme üben.

    a) Die Volkardsche Zahl hat die Eigenschaft, daß die Zahl,
    - die als ihrer ersten Ziffer gebildet wird, durch 1 teilbar ist und
    - die als ihrer ersten beiden Ziffern gebildet wird, durch 2 teilbar ist und
    - die als ihrer ersten drei Ziffern gebildet wird, durch 3 teilbar ist und


    Also 123
    würde das lösen bisher.
    1 ist duch 1 teilbar.
    12 ist durch 2 teilbar.
    123 ist durch 3 teilbar.

    - die als ihrer letzten vier Ziffern gebildet wird, durch 4 teilbar ist und

    …Schon gehts nicht mehr. 1234 passt nicht, 1432 ginge…

    - und so weiter
    - die als ihrer ersten neun Ziffern gebildet wird, durch 9 teilbar ist und

    jede Ziffer von 1 bis 9 kommt genau einmal vor, die 0 kommt nicht vor.

    b) Und das Acht-Damen-Problem.

    Dann löse Dich vom Backtracking, aber behalte es im Hinterkopf und Sudoku sollte relativ locker von der Hand gehen. Ich denke, viel schneller so, als wenn Du Dir jetzt an Sudoku den Kopf einrennst.


  • Mod

    Ist auch die Ziffer 0 erlaubt? Wenn nicht, dann gibt es keine volkard'sche Zahl (Teiler 5 und 2 schließen sich dann gegenseitig aus). Und wenn, dann ist die Lösung trivial (123456789000000000), denn jede ganze Zahl ist ein Teiler von 0.



  • Hat sich mein Deutsch über Nacht verabschiedet? Du hast so extrem "aus" mit "als" versetzt, dass da doch ein System dahintersteckt?



  • Arcoth schrieb:

    Und wenn, dann ist die Lösung trivial (123456789000000000), denn jede ganze Zahl ist ein Teiler von 0.

    Es ist die kleinste volkardsche Zahl gesucht.



  • Nicht mal zu der volkardschen Zahl fällt mir eine Herangehensweise ein /:
    Hat da vielleicht jmd einen Vorschlag? Evtl. auch wie man allgemein an solche Aufgaben herangeht um eine vernünftige Lösung zu finden...

    Entweder bin ich zu dumm oder zu müde 😃



  • Arcoth schrieb:

    Ist auch die Ziffer 0 erlaubt?

    Nein.

    Wenn nicht, dann gibt es keine volkard'sche Zahl (Teiler 5 und 2 schließen sich dann gegenseitig aus).

    Aufgabe war falsch. Von vorne.

    Warum hast Du da so einen Apostroph hineingefummelt?



  • Goldienator schrieb:

    Evtl. auch wie man allgemein an solche Aufgaben herangeht um eine vernünftige Lösung zu finden...

    Löse es ein paar mal per Hand.



  • Um noch mal auf die Sudokugeschichte zurückzukommen... 😃

    Mit Hilfe dieses Videos www.youtube.com/watch?v=F8JYIUOn_L4&hd=1

    bin ich zu dem Code gekommen:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    void draw(int feld[][8])
    {
        for (int zeile = 0; zeile < 9; ++zeile)
        {
            for(int spalte = 0; spalte < 9; ++spalte)
            {
                 cout << feld[spalte][zeile] << " ";
            }
    
            cout << endl;
        }
    }
    
    void eingabe(int feld[][8])
    {
        int spalte; 
    	int zeile;
    	int wert;
    	char input = ' ';
    
    	while(input != 'q')
    	{
    
    		cout << "Ihr Sodokufeld: " << endl << endl;
    		cout << "------------------------------------------" << endl
    		     << "-|| 0 | 1 | 2 || 3 | 4 | 5 || 6 | 7 | 8 ||" << endl
                 << "-||-----------||-----------||-----------||" << endl
    		     << "0|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "1|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "2|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "-||-----------||-----------||-----------||" << endl
                 << "3|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "4|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "5|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "-||-----------||-----------||-----------||" << endl
                 << "6|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "7|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "8|| x | x | x || x | x | x || x | x | x ||" << endl;
    
    		cout << endl << "Spalte (0-8): ";
    		cin >> spalte;
    		cout << endl << "Zeile (0-8): " ;
    		cin >> zeile;
    		cout << endl << "Wert (1-9) ";
    		cin >> wert;
    
    		feld[spalte][zeile] = wert;
    
    		cout << endl << "'q' + Enter zum fertigstellen. Beliebige Taste + Enter zum fortfahren." << endl << endl;
    		cin >> input;
    
    	}
    }
    
    bool chkZeile(int zeile, int wert, int arr[8][8])
    {
    	for (int spalte = 1; spalte < 9; ++spalte) //für Spalten-koordinate
    	{
    		if (arr[spalte][zeile] == wert) //wenn Feld (spalte, koordinnate) schon wert hat
    		{
    			return false;
    		}
    	}
    
    	return true;
    }
    
    bool chkSpalte(int spalte, int wert, int arr[8][8])
    {
    	for (int zeile = 1; zeile < 9; ++zeile)
    	{
    		if (arr[spalte][zeile] == wert)
    		{
    			return false;
    		}
    	}
    
    	return true;
    }
    
    bool chkBox(int spalte, int zeile, int wert, int arr[8][8])
    {
    	for (int i = 1; i < 9; ++i)
    	{
    		for (int j = 1; i < 9; ++i)
    		{
    			if (arr[spalte - (spalte%3) + i][zeile - (zeile%3) + j] == wert) //von links-oben nach rechts-unten
    			{
    				return false;
    			}
    		}
    	}
    	return true;
    }
    
    bool chkall(int spalte, int zeile, int wert, int arr[8][8])
    {
    	if (chkZeile(zeile, wert, arr) == false)
    	{
    		return false;
    	}
    
    	if (chkSpalte(spalte, wert, arr) == false)
    	{
    		return false;
    	}
    
    	if (chkBox(spalte, zeile, wert, arr) == false)
    	{
    		return false;
    	}
    
    	return true;
    }
    
    int solve(int spalte, int zeile, int wert, int arr[8][8])
    {
    	int workarr[8][8];
    	for (int i = 0; i < 9; ++i)
    	{
    		for (int j = 0; j < 9; ++j)
    		{
    			workarr[i][j] = arr[i][j];
    		}
    	}
    
    	workarr[zeile][spalte] = wert;
    
    	for (int x = 0; x < 9; ++x)
    	{
    		for (int y = 0; y < 9; ++y)
    		{
    			if(workarr[x][y] == 0)
    			{
    				for (int val = 1; val < 9; ++val)
    				{
    					if(chkall(x,y,val,workarr))
    					{
    						solve(x,y,val,workarr);
    					}
    				}
    				return NULL;
    			}
    		}
    	}
    }
    
    int main(int argc, char *argv[])
    {
        int feld[8][8] = {0};
    
        eingabe(feld);
    	solve(0,0,0,feld);
        draw(feld);
    	system("Pause");
    
        return 0;
    }
    

    Es wird jetzt an der Stelle angehalten, an der ich eine Kopie von dem der Funktion übergebenem Array, um damit dann weiter zu arbeiten, kommt die Fehlermeldung:

    Unbehandelte Ausnahme bei 0x012b8d38 in Sudoku-Löser.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xa835bbca.

    Weiß da jmd. einen Rat? :o



  • bitte lösche den code da, das ist einfach nur c mit cout, absolut unbrauchbar. gründe für den runtime error:
    1. zeile 13 (vll solltest du dir array-indices nochmals anschauen)
    2. zeile 65 (dito)
    3. zeile 78 (dito)
    4. zeile 93 (dito)
    5. zeile 139 (dito)
    6. zeile 143 (dito)
    7. zeile 124 (stackoverflow wenn zu tiefe rekursion)



  • 1. zeile 13 (vll solltest du dir array-indices nochmals anschauen)

    Was soll denn damit sein?


  • Mod

    Goldienator schrieb:

    1. zeile 13 (vll solltest du dir array-indices nochmals anschauen)

    Was soll denn damit sein?

    Zähl mal alle Zahlen von 0 an, die kleiner sind als 9. Wie viele sind das?



  • 0, 1, 2, 3, 4, 5, 6, 7, 8

    Sind neun Zahlen 😃



  • Oder irr ich mich da? 😕



  • Goldienator schrieb:

    Sind neun Zahlen 😃

    Und wie groß ist dein Feld?



  • Und wie groß ist dein Feld?

    0-8 (also 9) Zeilen und 0-8 Spalten.
    Sind ja dann insgesamt 81...

    Sieht man doch eigentlich auch im Code oder?

    cout << "------------------------------------------" << endl
                 << "-|| 0 | 1 | 2 || 3 | 4 | 5 || 6 | 7 | 8 ||" << endl
                 << "-||-----------||-----------||-----------||" << endl
                 << "0|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "1|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "2|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "-||-----------||-----------||-----------||" << endl
                 << "3|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "4|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "5|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "-||-----------||-----------||-----------||" << endl
                 << "6|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "7|| x | x | x || x | x | x || x | x | x ||" << endl
                 << "8|| x | x | x || x | x | x || x | x | x ||" << endl;
    


  • Goldienator schrieb:

    Und wie groß ist dein Feld?

    0-8 (also 9) Zeilen und 0-8 Spalten.
    Sind ja dann insgesamt 81...

    Sieht man doch eigentlich auch im Code oder?

    nicht die Zeichen, die du ausgibst. Wie groß ist dein Array?



  • nicht die Zeichen, die du ausgibst. Wie groß ist dein Array?

    Ich glaub ich versteh jetzt was ihr sagen wollt 😃

    Wenn ich ein Array mit 8 Speicherplätzen erstelle, kann ich das Array nur bis [7] ansprechen, weil [0] ja auch zu den 8 Plätzen dazu zählt, oder?!


  • Mod

    Goldienator schrieb:

    Wenn ich ein Array mit 8 Speicherplätzen erstelle, kann ich das Array nur bis [7] ansprechen, weil [0] ja auch zu den 8 Plätzen dazu zählt, oder?!

    So ist es.



  • Argghh... jetzt bin ich komplett verwirrt 😕 😮


Anmelden zum Antworten