#include <stdio.h>

int areRowsValid(int m[][9]) {
    int r;
    for (r = 0; r < 9; r = r + 1) {
        int c, checklist[9] = {0};
        for (c = 0; c < 9; c = c + 1) {
            int digit = m[r][c];
            if (digit != 0) {
                if (checklist[digit - 1] == 0) {
                    checklist[digit - 1] = 1;
                }
                else {
                    return 0;
                }
            }
        }
    }
    return 1;
}

int areColumnsValid(int m[][9]) {
    /* Vul hier de code voor areColumnsValid in */
}

int areBlocksValid(int m[][9]) {
    /* Vul hier de code voor areBlocksValid in */
}

int isValid(int m[][9]) {
    return areRowsValid(m) && areColumnsValid(m) && areBlocksValid(m);
}

int solve(int m[][9]) {
    int r, c, digit;
    for (r = 0; r < 9; r = r + 1) {
        for (c = 0; c < 9; c = c + 1) {
            if (m[r][c] == 0) {
                for (digit = 1; digit <= 9; digit = digit + 1) {
                    m[r][c] = digit;
                    if (isValid(m) && solve(m) == 1) {
                            return 1;
                    }
                    m[r][c] = 0;
                }
                return 0;
            }
        }
    }
    return 1;
}

void print(int m[][9]) {
    int r, c;
    for (r = 0; r < 9; r = r + 1) {
        for (c = 0; c < 9; c = c + 1) {
            printf("%d ", m[r][c]);
        }
        printf("\n");
    }
}

int isEqual(int m1[][9], int m2[][9]) {
    int r, c;
    for (r = 0; r < 9; r = r + 1) {
        for (c = 0; c < 9; c = c + 1) {
            if (m1[r][c] != m2[r][c]) {
                return 0;
            }
        }
    }
    return 1;
}

void printTestResult(int testNumber, int testResult) {
    if (testResult) {
        printf("Test %d is succesvol uitgevoerd.\n", testNumber);
    }
    else {
        printf("Test %d is NIET succesvol uitgevoerd!\n", testNumber);
    }
}

int main(void) {
    int puzzle1[9][9] = {
        {8 ,6 ,0 ,0 ,2 ,0 ,0 ,0 ,0},
        {0 ,0 ,0 ,7 ,0 ,0 ,0 ,5 ,9},
        {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
        {0 ,0 ,0 ,0 ,6 ,0 ,8 ,0 ,0},
        {0 ,4 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
        {0 ,0 ,5 ,3 ,0 ,0 ,0 ,0 ,7},
        {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
        {0 ,2 ,0 ,0 ,0 ,0 ,6 ,0 ,0},
        {0 ,0 ,7 ,5 ,0 ,9 ,0 ,0 ,0}
    };
    int solution1[9][9] = {
        {8, 6, 3, 9, 2, 5, 7, 4, 1},
        {4, 1, 2, 7, 8, 6, 3, 5, 9},
        {7, 5, 9, 4, 1, 3, 2, 8, 6},
        {9, 7, 1, 2, 6, 4, 8, 3, 5},
        {3, 4, 6, 8, 5, 7, 9, 1, 2},
        {2, 8, 5, 3, 9, 1, 4, 6, 7},
        {1, 9, 8, 6, 3, 2, 5, 7, 4},
        {5, 2, 4, 1, 7, 8, 6, 9, 3},
        {6, 3, 7, 5, 4, 9, 1, 2, 8}
    };
    
    solve(puzzle1);
    print(puzzle1);
    printTestResult(1, isEqual(puzzle1, solution1) == 1);

    getchar();
    return 0;
}
