2013年2月21日 星期四

ACM 10957 So Doku Checker

這題拿ACM 989的code改一改就可以上傳了XD

#include <stdio.h>

int quit, found, board[9][9], row_used[9][10], col_used[9][10], block_used[3][3][10];

void sudoku(int x, int y)
{
    int i, j;

    if (y == 9) {
        ++x;
        y = 0;
    }

    if (x == 9) {
        if (found)      // If we have already found a solution
            quit = 1;   // then stop solving the puzzle
        found = 1;
        return;
    }

    if (!quit && board[x][y]) {
        sudoku(x, y+1);
        return;
    }

    for (i = 1; !quit && i <= 9; ++i)
        if (!row_used[x][i] && !col_used[y][i]
            && !block_used[x/3][y/3][i]) {
            row_used[x][i] = col_used[y][i]
                           = block_used[x/3][y/3][i] = 1;
            board[x][y] = i;
            sudoku(x, y+1);
            board[x][y] = 0;
            row_used[x][i] = col_used[y][i]
                           = block_used[x/3][y/3][i] = 0;
        }
}

int main(void)
{
    int i, j, k, first, dont_do, count;

    count = 1;
    while (1) {
        found = dont_do = quit = 0;

        for (i = 0; i < 9; ++i)
            for (j = 1; j <= 9; ++j)
                row_used[i][j] = col_used[i][j] = 0;

        for (i = 0; i < 3; ++i)
            for (j = 0; j < 3; ++j)
                for (k = 1; k <= 9; ++k)
                    block_used[i][j][k] = 0;

        for (i = 0; i < 9; ++i)
            for (j = 0; j < 9; ++j) {
                if (scanf("%d", &board[i][j]) != 1)
                    return 0;
                if (board[i][j]
                    && (row_used[i][board[i][j]]
                        || col_used[j][board[i][j]]
                        || block_used[i/3][j/3][board[i][j]]))
                    dont_do = 1;
                row_used[i][board[i][j]] = 1;
                col_used[j][board[i][j]] = 1;
                block_used[i/3][j/3][board[i][j]] = 1;
            }

        printf("Case %d: ", count++);
        if (!dont_do)
            sudoku(0, 0);
        else {
            printf("Illegal.\n");
            continue;
        }

        if (!found)
            printf("Impossible.\n");
        else if (quit)
            printf("Ambiguous.\n");
        else
            printf("Unique.\n");
    }

    return 0;
}

沒有留言:

張貼留言