Sudoku-Rätsel lösen lassen



  • 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 😕 😮



  • damit du ein array hast mit 9 einträgen musst du es mit "int array[9]" definieren und kannst es dann mit "array[0]" ... "array[8]" ansprechen.



  • Okay... hab ich so weit verstanden 😉

    Jetzt erklärt mir das mal bitte mit dem Stackoverflow bei einer zu tiefen Rekursion... 😕

    Was ist damit genau gemeint?



  • mach einfach eine klasse die ein sudoku-spielfeld darstellt und intern einen vektor benutzt. etwa so:

    #include <vector>
    #include <iostream>
    using namespace std;
    class sudoku
    {
    public:
    	enum {
    		width = 9,
    		height = 9
    	};
    private:
    	vector<int> data;
    public:
    	sudoku(int fill = 0)
    		: data(width * height, fill) {
    	}
    	void solve() {
    		//...
    	}
    	int operator() (size_t x, size_t y) const {
    		return data[x + y * width];
    	}
    	int& operator() (size_t x, size_t y) {
    		return data[x + y * width];
    	}
    };
    ostream& operator<< (ostream& s, sudoku const& d) {
    	//...
    }
    int main()
    {
    	sudoku mein_spielfeld;
    	mein_spielfeld(0, 0) = 1;
    	mein_spielfeld.solve();
    	cout << mein_spielfeld;
    }
    

    das ganze ist viel einfacher zu bedienen...
    das mit dem möglichen stackoverflow wird damit gerade auch behoben denn ein std::vector speichert seine elemente auf dem heap. (bzw. nein, er legt sie mit new[] an aber damit wird normalerweise der heap angesprochen)



  • Goldienator schrieb:

    Okay... hab ich so weit verstanden 😉

    Jetzt erklärt mir das mal bitte mit dem Stackoverflow bei einer zu tiefen Rekursion... 😕

    Was ist damit genau gemeint?

    Jeder rekurtsive Aufruf braucht ein wenig Stackspeicher, so 20-50 Bytes vielleicht. Ruft sich eine Funktion oft selber auf, vieltausenmal, kann der STack ausgehen und das Programm stürzt ab.

    Wird Dir aber nicht passieren, weil Du bei vor jedem Abstieg eine Zahl einträgst und nach jedem Aufstieg sie wieder austrägst. Kannst nicht tiefer als 81 Ebenen abteigen. 81 ist voll unkritisch.

    Sogar, wenn Du nicht streichst (warum nicht, ist doch viel schneller und einfach genug), sondern Kopien hältst, wie Du es mit dem workarray machst, 81*sizeof(int)*81 ist auch locker um die 30k, kannst davon ausgehen, ca 1M zu haben.


Anmelden zum Antworten