文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

Takahashi's Information [AtCoder Beginner Contest 088 C]

atcoder.jp


与えられた 3 x 3 の数字が特定の形式になっているかどうかを判定する問題です。


問題の形式になっている 3 x 3 の数字の並びには、例えば以下のようなものが考えられます。


b[1] b[2] b[3]
a[1] 2 4 6
a[2] 4 6 8
a[3] 4 6 8


ここで、a[1]=2, a[2]=4, a[3]=4 としてマス目の数字から引いてみます。


b[1] b[2] b[3]
a[1] 0 2 4
a[2] 0 2 4
a[3] 0 2 4


このように、a[1], a[2], a[3] は引いた後の縦が等しくなるように選ぶ必要があります。


このとき、

b[1] b[2] b[3]
a[1] 0 0 0
a[2] 1 1 1
a[3] 2 4 2


数字の並びがこのようになっている場合は、それぞれの a をどう選んでも縦を等しくすることができません。
1列目を等しくしようとして a[1]=0, ar[2]=1, ar[3]=2 としたとき、2列目が 0,0,2 となってしまいます。


よって、入力で与えられた数字の並びが形式通りになっているかどうかは、


・C[2][1]-C[1][1] = C[2][2]-C[1][2] = C[2][3]-C[1][3] 中段-上段が左中右すべて等しいか
・C[3][1]-C[2][1] = C[3][2]-C[2][2] = C[3][3]-C[2][3] 下段-中段が左中右すべて等しいか


とすることで判定することができます。


void solve () {
	
	int[][] ar = new int[3][3];
	for (int i=0; i<3; i++) {
		for (int j=0; j<3; j++) {
			ar[i][j] = nextInt();
		}
	}

	int a = ar[1][0]-ar[0][0], b = ar[1][1]-ar[0][1], c = ar[1][2]-ar[0][2];
	int d = ar[2][0]-ar[1][0], e = ar[2][1]-ar[1][1], f = ar[2][2]-ar[1][2];
	
	if (a==b && b==c && a==c) {
		if (d==e && e==f && d==f) {
			out.println("Yes"); return;
		}
	}
	
	out.println("No");
	
}