Row-Checker für 2d-Arrays



  • Hallo zusammen, ich versuche einen Checker für Sudokus zu programmieren. Der Funktion wird ein ausgefülltes 9x9 Sudoku übergeben.

    Für den Zeilencheck habe ich folgendes programmiert, was an dem Code nicht funktioniert ist mir aber schleierhaft, ich bekomme immer True ausgewertet, auch wenn Zahlen in Zeilen doppelt vorkommen. Ist die verschachtelung der for-Schleifen fehlerhaft oder der Bedingungsausdruck(if(s[rowIndex][i] == s[rowIndex][j]) && i!=j) falsch?

    typedef int Sudoku[9][9];
    
    bool SudokuRowIsValid(Sudoku s, int rowIndex){
    	for(int i = 0; i<9; i++){
    		for(int j = 0; j<9; j++){
    			if(s[rowIndex][i] == s[rowIndex][j]) && i!=j){
    				cout << "Zeile " << rowIndex << " ist nicht akzeptiert." << endl;
    				return false;
    		}
    			else{
    				cout << "Zeile " << rowIndex << " ist in Ordnung" << endl;
    				return true;
    			}
    		}
    	}
    }
    

    Danke im Voraus für eure Hilfe.
    Grüße



  • Was war an volkars Lösung in

    http://www.c-plusplus.net/forum/329697

    nicht nachzuvollziehen für dich?

    Um nur mal am Rande auf deinen Code einzugehen: Wozu bauchst du überhaupt eine verschachtelte for-Schleife, wenn deine Funktion eh nur die row im vorgegeben index checken soll??



  • for(int i = 0; i<9; i++){
            for(int j = 0; j<9; j++){
                if(s[rowIndex][i] == s[rowIndex][j]) && i!=j){
    

    Prüft das nicht 81mal die Zeile gegen sich selbst?



  • cvcv schrieb:

    Was war an volkars Lösung in

    http://www.c-plusplus.net/forum/329697

    nicht nachzuvollziehen für dich?

    Um nur mal am Rande auf deinen Code einzugehen: Wozu bauchst du überhaupt eine verschachtelte for-Schleife, wenn deine Funktion eh nur die row im vorgegeben index checken soll??

    Danke für die Antwort.

    Naja, ich würde eigentlich gerne meinen Lösungsansatz zum laufen kriegen anstatt das jetzt aus dem anderen Post abzupinseln 🤡

    Die verschachtelte for-Schleife benötige ich doch vermutlich um für einen Eintrag i auch alle anderen Einträge der Reihe zu überprüfen und nicht nur den nächstgrößeren bzw. nächstkleineren, wie das mit nur einer Schleife möglich wäre, oder sehe ich das falsch??

    Liebe Grüße



  • Das else darf nicht innen sein. Es ist ja nicht true, wenn schon *eine* Kombination nicht kollidiert, sondern erst, wenn *alle* nicht kollidierten.

    bool SudokuRowIsValid(Sudoku s, int rowIndex) {
    	//Eine Kollision suchen:
    	for(int i = 0; i<9; i++) {
    		for(int j = 0; j<9; j++) {
    			if(s[rowIndex][i] == s[rowIndex][j]) && i!=j) {
    				cout << "Zeile " << rowIndex << " ist nicht akzeptiert." << endl;
    				return false;
    			}
    		}
    	}
    
    	//Wenn es überhaupt keine Kollission gab, dann
    	cout << "Zeile " << rowIndex << " ist in Ordnung" << endl;
    	return true;
    }
    

Anmelden zum Antworten