Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   help with sudoku (http://www.go4expert.com/forums/help-with-sudoku-t7093/)

panayiotispatra 28Oct2007 19:32

help with sudoku
 
Why it doesn't work? I try to make sudoku but I have many of lack
I must make a program sudoku that would read the elements from a text file


Code:

#include <stdio.h>
#include <stdlib.h>

#define SLP_INTERVAL 1

// task defined functions
int validNumber(int a);
int emptyCell(int array[9][9], int i, int j);
int numberInRow(int array[9][9], int i, int val);
int numberInCol(int array[9][9], int j, int val);
int numberIn3x3(int array[9][9], int i, int j, int val);
int completed(int array[9][9]);

// wrap functions to ease things up...
void echoMatrix(int array[9][9]);
int inTableBounds(int i, int j);
int freeCellSum(int array[9][9]);

char errMsg[] = "";

int main(int argc, char **argv) {
        int cX, cY, val;
        int isInterrupted = 0;
        int y,x;
          char buf[19];
  FILE *fp = fopen("sudoku.txt", "r");

        do {
                do {

                        #ifdef INTERACTIVE
                                system("clear");
                        #endif

                        echoMatrix(sudoku);

                        printf("Please give me your movement (%d cells): ", freeCellSum(sudoku));
                        fscanf(stdin, "%d,%d=%d", &cX, &cY, &val);

                        if(cX == -1 && cY == -1 && val == -1) {
                                isInterrupted = 1;
                                goto finished;
                        }

                        // notify user on error
                        if(!inTableBounds(cX, cY)) {
                                printf("(!) Out of table bounds box number set!\n");
                                continue;
                        }

                        if(!validNumber(val)) {
                                printf("(!) Erroneous value for sudoku cell!\n");
                                continue;
                        }

                        if(emptyCell(sudoku, cX - 1, cY - 1)) {
                                printf("(!) Cell not empty!\n");
                                continue;
                        }

                        if(numberInRow(sudoku, cX - 1, val) || numberInCol(sudoku, cY - 1, val) || numberIn3x3(sudoku, cX - 1, cY - 1, val)) {
                                printf("(!) Movement brakes game rules (%s)!\n", errMsg);
                        }

                } while((emptyCell(sudoku, cX - 1, cY - 1) || !validNumber(val) || emptyCell(sudoku, cX - 1, cY - 1) || numberInRow(sudoku, cX - 1, val) || numberInCol(sudoku, cY - 1, val) || numberIn3x3(sudoku, cX - 1, cY - 1, val)));

                sudoku[cX - 1][cY - 1] = val;

                printf("Value accepted! Waiting for your next movement.\n");

                #ifdef INTERACTIVE
                        sleep(SLP_INTERVAL);
                #endif

        } while(!completed(sudoku));

        finished:

        if(!isInterrupted)
                printf("Congratulations! You\'ve come to the end of this game!\n");
        else
                printf("Game exiting... Good bye!\n");

        exit(EXIT_SUCCESS);
}

//{{
//checks if a (x,y) coordinate set is within the sudoku matrix bounds
//}}
int inTableBounds(int i, int j) {
        return((i >= 1 && i <= 9 && j >= 1 && j <= 9 && (i != -1 && j != -1)) ? 1 : 0);
}

// {{
// returns number of available free cells
// }}
int freeCellSum(int array[9][9]) {
        int p = 0, i, j;

        for(i = 0; i <= 8; i++) {
                for(j = 0; j <= 8; j++) {
                        if(array[i][j] == 0)
                                p++;
                }
        }

        return(p);
}

//{{
//prints current sudoku matrix on stdout
//}}
void echoMatrix(int array[9][9]) {
        int i, j;

        for(i = 0; i <= 8; i++) {
                for(j = 0; j <= 8; j++) {
                        printf("%i ", array[i][j]);
                }

                printf("\n");
        }
}

//{{
//checks whether a is between 1 and 9 (sudoku matrix bounds)
//}}
int validNumber(int a) {
        return((a >= 1 && a <= 9) ? 1 : 0);
}

//{{
// checks if cell already has a non-zero value
//}}
int emptyCell(int array[9][9], int i, int j) {
        return((array[i][j] != 0) ? 1 : 0);
}

// {{
// checks if the game matrix contains val in row i
// }}
int numberInRow(int array[9][9], int i, int val) {
        int k = 0, p = 0;

        for(; k <= 8; k++) {
                if(array[i][k] == val) {
                        p++;
                        sprintf(errMsg, "Equal value at (%d,%d) in row check", i + 1, k + 1);
                        break;
                }
        }

        return((p >= 1) ? 1 : 0);
}

// {{
// checks if the sudoku matrix already contains value val in col j
// }}
int numberInCol(int array[9][9], int j, int val) {
        int k = 0, p = 0;

        for(; k <= 8; k++) {
                if(array[k][j] == val) {
                        p++;
                        sprintf(errMsg, "Equal value at (%d,%d) in col check", k + 1, j + 1);
                        break;
                }
        }

        return((p >= 1) ? 1 : 0);
}

// {{
// checks whether value val corresponding to (i,j) exists in 3x3 tbl
// }}
int numberIn3x3(int array[9][9], int i, int j, int val) {
        int sCoordX, sCoordY, coordX, coordY;
        int p = 0;

        if(i >= 0 && i <= 2) sCoordX = 0;
        if(i >= 3 && i <= 5) sCoordX = 3;
        if(i >= 6 && i <= 8) sCoordX = 6;
        if(j >= 0 && j <= 2) sCoordY = 0;
        if(j >= 3 && j <= 5) sCoordY = 3;
        if(j >= 6 && j <= 8) sCoordY = 6;

        for(coordX = sCoordX; coordX <= (sCoordX + 2); coordX++) {
                for(coordY = sCoordY; coordY <= (sCoordY + 2); coordY++) {
                        // avoid marking the examined value as existing two times
                        // in our logic
                        if((array[coordX][coordY] == val) && coordX != i && coordY != j) {
                                p++;
                                sprintf(errMsg, "Value allready exists in 3x3 at (%d,%d)", coordX + 1, coordY + 1);
                                break;
                        }
                }
        }

        return((p >= 1) ? 1 : 0);
}

// {{
// checks whether the game's finished
// }}
int completed(int array[9][9]) {
        int i, j, zp = 0;

        for(i = 0; i < 9; i++) {
                for(j = 0; j < 9; j++) {
                        if(array[i][j] == 0)
                                zp++;
                }
        }

        return((zp > 0) ? 0 : 1);
}



All times are GMT +5.5. The time now is 10:18.