POJ3435 Sudoku Checker

来源:互联网 发布:mac chili色号 编辑:程序博客网 时间:2024/05/22 14:24

问题链接:POJ3435 Sudoku Checker。入门练习题,用C语言编写程序。

题意简述:输入n,然后输入(n×n)×(n×n)的二维数组,0表示可以是任意值,编写程序检查这些数据是否满足数独的初始状态。

问题分析:需要做的检查有:值范围检查,行、列和块的值重复检查。

程序中编写函数getblock()用于将行和列的值转换为块的值。

AC的C语言程序如下:

/* POJ3435 Sudoku Checker */#include <stdio.h>#include <memory.h>#define MAXN 10+1int row[MAXN * MAXN][MAXN * MAXN];int col[MAXN * MAXN][MAXN * MAXN];int block[MAXN * MAXN][MAXN * MAXN];/* 行列下标转换为块下标 */int getblock(int row, int col, int n){    return (row / n) * n + col / n;}int main(void){    int n, okflag, val, square, b, i, j;    while(scanf("%d", &n) != EOF) {        memset(row, 0, sizeof(row));        memset(col, 0, sizeof(col));        memset(block, 0, sizeof(block));        okflag = 1;        square = n * n;        for(i=0; i<square; i++)            for(j=0; j<square; j++) {                scanf("%d", &val);                if(val > square)                    okflag = 0;                else if(val) {                    b = getblock(i, j, n);                    if(row[i][val -1] || col[j][val - 1] || block[b][val - 1])                        okflag = 0;                    row[i][val - 1] = 1;                    col[j][val - 1] = 1;                    block[b][val - 1] = 1;                }            }        printf("%s\n", okflag ? "CORRECT" : "INCORRECT");    }    return 0;}



1 0