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;
}
posted @ 2023-12-14 21:09  ZnHF  阅读(10)  评论(0编辑  收藏  举报