Skip to content

Latest commit

 

History

History
100 lines (87 loc) · 1.67 KB

079.md

File metadata and controls

100 lines (87 loc) · 1.67 KB

079 - Two by Two (★3)

解答

#include <iostream>
#include <vector>
#include <cmath> // std::abs()

int main()
{
	// H 行, W 列
	int H, W;
	std::cin >> H >> W;

	// 2 次元配列 (大きさ W の vector が H 個)
	std::vector<std::vector<int>> A(H, std::vector<int>(W));
	for (auto& row : A)
	{
		for (auto& a : row)
		{
			std::cin >> a;
		}
	}

	// 2 次元配列 (大きさ W の vector が H 個)
	std::vector<std::vector<int>> B(H, std::vector<int>(W));
	for (auto& row : B)
	{
		for (auto& b : row)
		{
			std::cin >> b;
		}
	}

	// 操作回数の合計
	long long count = 0;

	for (int y = 0; y < (H - 1); ++y) // 上から y 行目
	{
		for (int x = 0; x < (W - 1); ++x) // 左から x 列目
		{
			// 現在注目しているマスの A, B それぞれの値
			const int a = A[y][x];
			const int b = B[y][x];

			// a と b の差
			const int diff = (b - a);
			
			// 操作によって現在注目しているマスの A, B それぞれの値を一致させる
			A[y][x] += diff;
			A[y][x + 1] += diff;
			A[y + 1][x] += diff;
			A[y + 1][x + 1] += diff;

			// 差の絶対値が操作回数
			count += std::abs(diff);
		}
	}

	// 一致するか
	bool match = true;

	// A, B の一番右の列が一致するかを調べる
	//
	// ----*
	// ----*
	// ----*
	// ----*
	// ----*
	//
	for (int y = 0; y < H; ++y)
	{
		if (A[y].back() != B[y].back())
		{
			// 一致しなかった
			match = false;
			break;
		}
	}

	// A, B の最後の行が一致するかを調べる
	// 
	// -----
	// -----
	// -----
	// -----
	// *****
	//
	if (match && (A.back() == B.back())) 
	{
		std::cout << "Yes\n";
		std::cout << count << '\n';
	}
	else
	{
		std::cout << "No\n";
	}
}