問題概要
$3×3$ のグリッドがある。各行を上から$i$、各列を左から$j$でナンバリングしていく時、マス$(i,j)$に数$c_{i,j}$が書かれている。
また $c_{i,j} = a_i + b_j$である。
以下のように$c_{1,1}$~$c_{3,3}$までが与えられる時、成立するか判定しろ。
1 0 1
2 1 2
1 0 1
制約条件
$c_{i,j} (1≤i≤3,1≤j≤3)$ は $0$ 以上 $100$ 以下の整数
考えたこと
$c_{i,j} = a_i + b_j$ ということは $c_{i,j} - a_i = b_j$ である。
よって、各行の数から $a_i$を引き、各列の値が同じになれば与えられたグリッドは正しいと言える。
ではどのように$a_i$を求めるかだが、$a_i$と$b_j$の制約はないため、同じ基準で$a_i$を仮定すればよい。私は最小値を使った。
計算量は入力によらず一定で $O(1)$である。
解答
c.cs
using System;
using System.Linq;
class Program
{
static void Main(string[] args) {
int[][] c = new int[3][];
c[0] = Console.ReadLine().Split().Select(int.Parse).ToArray();
c[1] = Console.ReadLine().Split().Select(int.Parse).ToArray();
c[2] = Console.ReadLine().Split().Select(int.Parse).ToArray();
Console.WriteLine(solve(c) ? "Yes" : "No");
}
static bool solve(int[][] c) {
for (int i = 0; i < c.Length; i ++) {
int min = c[i].Min();
for (int j = 0; j < c[i].Length; j ++) {
c[i][j] -= min;
}
}
for (int i = 0; i < c.Length; i ++) {
if(c[0][i] != c[1][i] || c[1][i] != c[2][i]) return false;
}
return true;
}
}