[COCI 2023/2024 #1] Sudoku 题解
include13_fAKe · · 题解
题意
给定一个九宫标准数独游戏盘。里面有一些格子填了数,还有一些格子没有填数。
表示这个游戏盘要用三大类字符:
+和-:数独游戏盘的边框(包括九宫格的边框)。-
.:准备要填的数。
定义出现矛盾如下:在同一行(列、九宫格)中有重复的数字。
询问在已填好的数中,是否已出现了矛盾。(不把 . 填完)。
思路
直接暴力统计在同一行(列、九宫格)中是否出现了矛盾。
可以用
定义
若 GRESKA,并结束程序。
但一定要在搜完一行(列、九宫格)的时候清空
最后,如果游戏盘没有问题,要记得输出 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;
}