void main() {
    sudoku(1, 1);
}

boolean sudoku(int reihe, int spalte) {
    if (reihe < 1 || reihe > 9 || spalte < 1 || spalte > 9) {
        return false;
    }
    if (istBelegt(reihe, spalte)) {
        return sudoku(nextR(reihe, spalte), nextS(reihe, spalte));
    } else {
        for (int zahl = 1; zahl <= 9; zahl++) {
            if (ok(reihe, spalte, zahl)) {
                setzen(reihe, spalte, zahl);
                if (voll()) {
                    return true;
                } else {
                    if (sudoku(nextR(reihe, spalte), nextS(reihe, spalte))) {
                        return true;
                    }
                }
                loeschen(reihe, spalte);
            }
        }
        return false;
    }
}

int nextR(int reihe, int spalte) {
    if (spalte < 9) {
        return reihe;
    } else {
        return reihe + 1;
    }
}

int nextS(int reihe, int spalte) {
    if (spalte < 9) {
        return spalte + 1;
    } else {
        return 1;
	}
}

boolean ok(int reihe, int spalte, int wert) {
    for (int i = 1; i <= 9; i++) {
        if (i != spalte && !istLeer(reihe, i) && welcheZahl(reihe, i) == wert) {
            return false;
        }
    }
    
    for (int i = 1; i <= 9; i++) {
        if (i != reihe && !istLeer(i, spalte) && welcheZahl(i, spalte) == wert) {
            return false;
        }
    }
    
    reihe = reihe -1;
    spalte = spalte-1;
    for (int r = reihe / 3 * 3; r < reihe / 3 * 3 + 3; r++) {
        for (int s = spalte / 3 * 3; s < spalte / 3 * 3 + 3; s++) {
            if (!(r == reihe && s == spalte) && !istLeer(r+1, s+1) && welcheZahl(r+1, s+1) == wert) {
                return false;
            }
        }
    }
    
    return true;
}

boolean voll() {
    for (int r = 1; r <= 9; r++) {
        for (int s = 1; s <= 9; s++) {
            if (istLeer(r, s)) {
              return false;
            }
        }
    }
    return true;
}
