Official

C - Number Place Editorial by mechanicalpenciI


for 文による繰り返しなどを用いて与えられた \(3\) つの条件をみたしているか判定すれば良いです。 判定は、例えば \(1\) から \(9\) の数字に対してその数字が登場したかのフラグを管理・更新しながら、各行・各列などの調べる必要のある範囲を走査することによって行うことができます。

各条件に対して各マスは 高々 \(1\) 回しか参照しないため、愚直に実装しても十分間に合います。よってこの問題を解くことができました。

c++ による実装例:

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

int main() {
	int a[9][9];
	int b[9];
	bool flag=true;
	for(int i=0;i<9;i++)for(int j=0;j<9;j++)cin>>a[i][j];
	for(int i=0;i<9;i++){
        for(int k=0;k<9;k++)b[k]=0;
		for(int j=0;j<9;j++)b[a[i][j]-1]++;
		for(int k=0;k<9;k++)if(b[k]!=1)flag=false;
	}
    for(int j=0;j<9;j++){
        for(int k=0;k<9;k++)b[k]=0;
		for(int i=0;i<9;i++)b[a[i][j]-1]++;
		for(int k=0;k<9;k++)if(b[k]!=1)flag=false;
    }
	for(int i=0;i<9;i+=3){
		for(int j=0;j<9;j+=3){
			for(int k=0;k<9;k++)b[k]=0;
			for(int ii=0;ii<3;ii++){
				for(int jj=0;jj<3;jj++){
					b[a[i+ii][j+jj]-1]++;
				}
			}
			for(int k=0;k<9;k++)if(b[k]!=1)flag=false;
		}
	}
	if(flag)cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
	return 0;
}

posted:
last update: