Soduko Tester



  • Ohhh, vielen Dank 🙂 Dass sieht schon viel schöner aus 🙂

    Naja..zum Beispiel sind bei der Überprüfung der Zeile Zeile und Wert feste Zahlen..aber für das ganze Soduko muss Zeile ja von 0 bis 8 gehen und Wert von 1 bis 9 gehen..oder versteh ich da was falsch?



  • Ist das Programm nicht von dir und du versuchst es zu verstehen?
    Oder funktioniert es nicht wie gewollt?



  • Das Programm ist von mir und ich versteh es sogar ;-D
    Aber ich hab es in dem glauben geschrieben, das das vorgegebene Soduko immer richtig ist, dann funktioniert mein Programm auch. Aber jetzt brauche ich eine Funktion, die das gesamte Soduko auf Gültigkeit testet..und da komme ich einfach nicht weiter..



  • Also du hast einen Anfangszustand des Sudukos (durch das Einlesen der Datei) und wenn dieser Anfangszustand richtig ist, dann funktioniert alles.
    Richtig soweit?
    Falls ja, dann wende den Test doch einfach auch in deiner einlese-Funktion an.



  • Genau 😃

    Na, dass funktioniert bei meinem Code ja leider nicht, weil Zeile und Spalte feste, vom Benutzer vorgegebene Zahlen sind.
    Also zum Beispiel, wenn der Benutzer ins erste Feld (1. Spalte, 1. Zeile) dann ist Zeile 0 und wird so getestet:

    //Teste Zeile
            int countZeile = 0;
            for (int j = 0; j < 9; ++j)
            {
                if (soduko [zeile] [j] == wert)
                    {
                    countZeile ++;
                    }
            }
    

    Aber um das ganze Soduko auf Gültigkeit zu überprüfungen muss ich ja in jeder Zeile/Spalte/Quadrat schauen ob eine Zahl doppelt vorkommt. Dass heiß mein Code ist Schrott 😡 oder?



  • eigentlich musst du doch nur folgendes überprüfen:
    - anzahl der zahlen von 1 - 9 in jeder zeile jeweils = 1
    - anzahl der zahlen von 1 - 9 in jeder spalte jeweils = 1
    - anzahl der zahlen von 1 - 9 in jedem quadrat jeweils = 1

    also

    //zeilen überprüfen
    for(i=0;i<9;i++)
    {
    for(j=1;j<=j;j++) //jede einzelne zahl
    {
    for(k=0;k<9;k++) //jedes einzelne element
    {
    if(sudoku[i][k]==j)
    {
    zaehler++; //Anzahl der einzelnen ziffern durchzählen
    }
    }
    if(zaehler!=1)
    {
    //Fehler
    }
    }
    

    das gleiche dann nochmal umgeschrieben für jede einzelne spalte und für jedes einzelne quadrat, wobei du dann logischerweise nur bis drei zählen darfst und je nachdem, welches quadrat du ansprechen willst, entsprechende offsets setzen musst, also für 1. quadrat 0 für zeile und spalte, für 2. quadrat 0 für die zeile und 3 für die spalte, für das 4. 0 für die spalte und 3 für die zeile und für das 9. eben 6 für zeile und spalte. mals dir am besten auf!



  • oo.OOO.oo schrieb:

    Genau 😃

    Na, dass funktioniert bei meinem Code ja leider nicht, weil Zeile und Spalte feste, vom Benutzer vorgegebene Zahlen sind.
    ...
    Dass heiß mein Code ist Schrott 😡 oder?

    Na ja, wie auch immer. Sauber getrennt sind die Funktionen der Funktionen (schön 🙂 ) jedenfalls nicht. Besser So:

    testeBelegung(int wert, int zeile, int spalte);
    

    Und dann so

    bool einlesen () // Es fehlt, wenn soduko zu lehr
        {
        ...
            for (int i = 0; i < 9; ++i)
            {
                for(int j = 0; j < 9; ++j)
                {
                int v;
                input >> v;
                if( ! testeBelegung(v, i, j))
                    ...
    
                }
            }
            return 1;
    
        }
        }
    


  • Erstmal vielen Dank für eure Hilfe!

    @HansKlaus
    Was meinst du mit

    for(j=1;j<=j;j++) //jede einzelne zahl
    

    dem j<=j ? Oder meinst du j < 10 ?

    @Jockelx
    Probier ich gleich aus, danke 🙂



  • Ich meinte j<=9 😃
    Ist sone Angewohnheit von mir, bei zählen ab 0 kleiner zu vergleichen und bei zählen ab 1 kleiner gleich



  • HansKlaus schrieb:

    eigentlich musst du doch nur folgendes überprüfen:
    - anzahl der zahlen von 1 - 9 in jeder zeile jeweils = 1
    - anzahl der zahlen von 1 - 9 in jeder spalte jeweils = 1
    - anzahl der zahlen von 1 - 9 in jedem quadrat jeweils = 1

    also

    //zeilen überprüfen
    for(i=0;i<9;i++)
    {
    for(j=1;j<=j;j++) //jede einzelne zahl
    {
    for(k=0;k<9;k++) //jedes einzelne element
    {
    if(sudoku[i][k]==j)
    {
    zaehler++; //Anzahl der einzelnen ziffern durchzählen
    }
    }
    if(zaehler!=1)
    {
    //Fehler
    }
    }
    

    das gleiche dann nochmal umgeschrieben für jede einzelne spalte und für jedes einzelne quadrat, wobei du dann logischerweise nur bis drei zählen darfst und je nachdem, welches quadrat du ansprechen willst, entsprechende offsets setzen musst, also für 1. quadrat 0 für zeile und spalte, für 2. quadrat 0 für die zeile und 3 für die spalte, für das 4. 0 für die spalte und 3 für die zeile und für das 9. eben 6 für zeile und spalte. mals dir am besten auf!

    Also ich hab dass jetzt versucht umzusetzen - funkt nicht 😕

    bool testeBelegung()
        {
        int count = 0;
        for (int i = 0; i < 9; i++)
        {
            for (int zahl = 1; zahl <= 9 ; zahl++)
            {
                for (int j = 0; j < 9; j++)
                {
                    if (soduko[i][j] == zahl)
                    {
                     count ++;
                    }
                }
            }
        }
    
                    std::cout<<count;
                    if (count > 1)
                    {
                        std::cout<<"Nicht moeglich";
                        return 0;
                    }
                    else
                    {
                        std::cout<<"Moeglich";
                        return 1;
                    }
    
        }
    

    Aber wenn ich dass jetzt richtig verstanden hab zählt dass jetzt in wie viele Felder lehr sind..aber dass müsste man doch erst nach den ziffern 1 - 9 trennen und nach zeilen, oder mach ich da was falsch?



  • also das was ich da geschrieben habe, war eine endgültige überprüfung, ob alle zeilen korrekt belegt sind, das gleiche müsstest du natürlich auch noch für die spalten und für die einzelnen quadrate durchführen; wobei das natürlich die endgültige überprüfung wäre, sprich alle felder sind belegt.

    zur überprüfung, ob eine zahl eingesetzt werden kann, würde ich einfach überprüfen, ob diese in zeile, spalte und quadrat bereits vorhanden ist.



  • HansKlaus schrieb:

    also das was ich da geschrieben habe, war eine endgültige überprüfung, ob alle zeilen korrekt belegt sind, das gleiche müsstest du natürlich auch noch für die spalten und für die einzelnen quadrate durchführen; wobei das natürlich die endgültige überprüfung wäre, sprich alle felder sind belegt.

    zur überprüfung, ob eine zahl eingesetzt werden kann, würde ich einfach überprüfen, ob diese in zeile, spalte und quadrat bereits vorhanden ist.

    So weit bin ich sogar auch schon...
    Aber ich versuche ein Programm zu schreiben, dass testet ob in einem halbvollem Soduko bereits Fehler sind..
    Fällt dir dazu vll was ein?



  • müsste das nicht klappen, indem zu die felder einfach mit 0 initialisierst? ich meine, auf 0 wird ja gar nicht geprüft, aber wenn die anderen zahlen mehrfach vorkommen, schlägt der code von mir ja schon an.



  • HansKlaus schrieb:

    müsste das nicht klappen, indem zu die felder einfach mit 0 initialisierst? ich meine, auf 0 wird ja gar nicht geprüft, aber wenn die anderen zahlen mehrfach vorkommen, schlägt der code von mir ja schon an.

    Also falls ich deinen Code richtig umgesetzt hab, stört ihn die -1 genauso wenig wie die 0..zählt aber auch nur die anzahl der Felder indenen keine -1 ist.



  • naja -1 und irgendwas anderes als 1 - 9 filterst du ja durch die initaialisierung mit 0 und entsprechenden abfragen, ob die einzusetzende zahl im erlaubten bereich liegt, raus und alle anderen fehler können dann ja nur noch darin bestehen, dass eine bestimmte zahl mehrfach in einer zeile, einer spalte oder in einem quadrat vorkommt.


Anmelden zum Antworten