P9903 题解
题意简述
给定一个数独网格,判断这个数独网格是否合法。
题目分析
模拟题意即可。
具体地,我们可以设 \(line_{i,j}\) 表示位于第 \(i\) 行的数字 \(j\) 出现的次数,\(col_{i,j}\) 表示位于第 \(i\) 行的数字 \(j\) 出现的次数。遍历整个数独网格以确定每一个 \(line_{i,j}\) 和 \(col_{i,j}\) 的取值。
对于每个宫格,我们以从左到右,从上到下的方式为它们依次标号,如图所示。
设 \(box_{i,j}\) 表示位于第 \(i\) 行的数字 \(j\) 出现的次数。遍历整个数独网格以确定每一个 \(box_{i,j}\) 的取值。
最后检查每一个 \(line_{i,j}\) 和 \(col_{i,j}\) 以及 \(box_{i,j}\) 如果它们中有任何一个的值大于 \(1\),则说明给定的数独网格不合法,否则说明给定的数独网格是合法的。
Code
#include<bits/stdc++.h>
using namespace std;
char a[100][100];
int box[100][100],line[100][100],col[100][100];
int main(){
for(int i=1;i<=13;i++){
for(int j=1;j<=13;j++){
cin>>a[i][j];
if(a[i][j]>='0' && a[i][j]<='9') a[i][j]-='0';
}
}
for(int i=1;i<=13;i++){
for(int j=1;j<=13;j++){
if(a[i][j]>=0 && a[i][j]<=9){
line[i][a[i][j]]++;
}
}
}
for(int i=1;i<=13;i++){
for(int j=1;j<=13;j++){
if(a[j][i]>=0 && a[j][i]<=9){
col[i][a[j][i]]++;
}
}
}
for(int i=1;i<=13;i++){
for(int j=1;j<=13;j++){
if(i>=2 && i<=4 && j>=2 && j<=4) box[1][a[i][j]]++;
else if(i>=2 && i<=4 && j>=6 && j<=8) box[2][a[i][j]]++;
else if(i>=2 && i<=4 && j>=10 && j<=12) box[3][a[i][j]]++;
else if(i>=6 && i<=8 && j>=2 && j<=4) box[4][a[i][j]]++;
else if(i>=6 && i<=8 && j>=6 && j<=8) box[5][a[i][j]]++;
else if(i>=6 && i<=8 && j>=10 && j<=12) box[6][a[i][j]]++;
else if(i>=10 && i<=12 && j>=2 && j<=4) box[7][a[i][j]]++;
else if(i>=10 && i<=12 && j>=6 && j<=8) box[8][a[i][j]]++;
else if(i>=10 && i<=12 && j>=10 && j<=12) box[9][a[i][j]]++;
}
}
for(int i=1;i<=13;i++){
for(int j=0;j<=9;j++){
if(line[i][j]>1 || col[i][j]>1 || box[i][j]>1){
puts("GRESKA");
return 0;
}
}
}
puts("OK");
return 0;
}