Takahashi's Information [AtCoder Beginner Contest 088 C]
与えられた 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"); }