[COCI 2023/2024 #1] Sudoku 题解

· · 题解

题意

给定一个九宫标准数独游戏盘。里面有一些格子填了数,还有一些格子没有填数。

表示这个游戏盘要用三大类字符:

定义出现矛盾如下:在同一行(列、九宫格)中有重复的数字。

询问在已填好的数中,是否已出现了矛盾。(不把 . 填完)。

思路

直接暴力统计在同一行(列、九宫格)中是否出现了矛盾。

可以用 sum 数组记录在这一行(列、九宫格)中 1\sim9 每一个数字出现的次数。

定义 sum_i 为数字 i 的出现次数,每搜到一个数字 i,就让 sum_i 的值加 1

sum_i>1,说明已经出现了矛盾,可以马上输出 GRESKA并结束程序

但一定要在搜完一行(列、九宫格)的时候清空 sum 数组。

最后,如果游戏盘没有问题,要记得输出 OK 再结束。

代码

#include<bits/stdc++.h>
using namespace std;

char s[15][15];
int sum[15];
int main(){
    for(int i=1;i<=13;i++){
        for(int j=1;j<=13;j++){
            cin>>s[i][j];
        }
    }
    for(int i=1;i<=13;i++){
        if(i%4==1)  continue;
        memset(sum,0,sizeof(sum));
        for(int j=1;j<=13;j++){
            if(s[i][j]>='0'&&s[i][j]<='9'){
                sum[s[i][j]-'0']++;
                if(sum[s[i][j]-'0']>1){
                    puts("GRESKA");
                    return 0;
                }
            }
        }
    }
    for(int i=1;i<=13;i++){
        if(i%4==1)  continue;
        memset(sum,0,sizeof(sum));
        for(int j=1;j<=13;j++){
            if(s[j][i]>='0'&&s[j][i]<='9'){
                sum[s[j][i]-'0']++;
                if(sum[s[j][i]-'0']>1){
                    puts("GRESKA");
                    return 0;
                }
            }
        }
    }
    for(int i=1;i<=13;i++){
        if(i%4!=2)  continue;
        for(int j=1;j<=13;j++){
            if(j%4!=2)  continue;
            memset(sum,0,sizeof(sum));
            for(int i1=0;i1<=2;i1++){
                for(int j1=0;j1<=2;j1++){
                    if(s[i+i1][j+j1]>='0'&&s[i+i1][j+j1]<='9'){
                        sum[s[i+i1][j+j1]-'0']++;
                        if(sum[s[i+i1][j+j1]-'0']>1){
                            puts("GRESKA");
                            return 0;
                        }
                    }
                }
            }
        }
    }
    puts("OK");
    return 0;
}