Skip to content

Latest commit

 

History

History
244 lines (195 loc) · 4.32 KB

004.md

File metadata and controls

244 lines (195 loc) · 4.32 KB

004 - Cross Sum (★2)

解答 1

#include <iostream>
#include <vector>

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

	// マス目 (大きさ W の vector が H 個)
	std::vector<std::vector<int>> A(H, std::vector<int>(W));

	// 各行の合計 (H 個)
	std::vector<int> rowSums(H);

	// 各列の合計 (W 個)
	std::vector<int> colSums(W);

	// マス目の入力	
	for (int y = 0; y < H; ++y) // 上から y 行目
	{
		for (int x = 0; x < W; ++x) // 左から x 列目
		{
			int a;
			std::cin >> a;

			// 現在のマスを記録
			A[y][x] = a;

			// 現在の行の合計値を増やす
			rowSums[y] += a;

			// 現在の列の合計値を増やす
			colSums[x] += a;
		}
	}

	// 解答の出力
	for (int y = 0; y < H; ++y) // 上から y 行目
	{
		for (int x = 0; x < W; ++x) // 左から x 列目
		{
			// 現在の行の合計値 + 現在の列の合計値 - 現在のマス
			const int a = (rowSums[y] + colSums[x] - A[y][x]);

			std::cout << a << ' ';
		}

		std::cout << '\n';
	}
}

解答 2 (二次元配列を一次元配列で代用)

二次元配列は一次元配列で表現することもできる。

例:

#include <iostream>
#include <vector>

int main()
{
	int H = 4, W = 3;
	std::vector<std::vector<int>> v =
	{
		{11, 12, 13},
		{21, 22, 23},
		{31, 32, 33},
		{41, 42, 43},
	};

	int y = 3, x = 2;
	std::cout << v[y][x] << '\n'; //43
}

#include <iostream>
#include <vector>

int main()
{
	int H = 4, W = 3;
	std::vector<int> v =
	{
		11, 12, 13,
		21, 22, 23,
		31, 32, 33,
		41, 42, 43,
	};

	int y = 3, x = 2;
	std::cout << v[y * W + x] << '\n'; //43
}

で表す。

#include <iostream>
#include <vector>

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

	// マス目 (全部で H * W 個)
	std::vector<int> A(H * W);
	
	// 各行の合計 (H 個)
	std::vector<int> rowSums(H);
	
	// 各列の合計 (W 個)
	std::vector<int> colSums(W);
	
	// マス目の入力	
	for (int y = 0; y < H; ++y) // 上から y 行目
	{
		for (int x = 0; x < W; ++x) // 左から x 列目
		{
			int a;
			std::cin >> a;

			// 現在のマスを記録
			A[y * W + x] = a;
			
			// 現在の行の合計値を増やす
			rowSums[y] += a;
			
			// 現在の列の合計値を増やす
			colSums[x] += a;
		}
	}

	// 解答の出力
	for (int y = 0; y < H; ++y) // 上から y 行目
	{
		for (int x = 0; x < W; ++x) // 左から x 列目
		{
			// 現在の行の合計値 + 現在の列の合計値 - 現在のマス
			const int a = (rowSums[y] + colSums[x] - A[y * W + x]);

			std::cout << a << ' ';
		}

		std::cout << '\n';
	}
}

デバッグ出力付き解答コード

プログラムの途中で std::vector にどのような値が格納されているか確認したい場合は、次のようにデバッグ出力を加えると良い。

#include <iostream>
#include <vector>

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

	// マス目 (全部で H * W 個)
	std::vector<int> A(H * W);
	
	// 各行の合計 (H 個)
	std::vector<int> rowSums(H);
	
	// 各列の合計 (W 個)
	std::vector<int> colSums(W);
	
	// マス目の入力
	for (int y = 0; y < H; ++y) // 上から y 行目
	{
		for (int x = 0; x < W; ++x) // 左から x 列目
		{
			int a;
			std::cin >> a;

			// 現在のマスを記録
			A[y * W + x] = a;
			
			// 現在の行の合計値を増やす
			rowSums[y] += a;
			
			// 現在の列の合計値を増やす
			colSums[x] += a;
		}
	}

	//////////////////////////
	//
	// デバッグ出力
	//
	{
		for (int y = 0; y < H; ++y) // 上から y 行目
		{
			for (int x = 0; x < W; ++x) // 左から x 列目
			{
				const int a = A[y * W + x];

				// 現在のマスを出力
				std::cerr << a << ' ';
			}

			// 現在の行の合計値を出力
			std::cerr << ":: " << rowSums[y] << '\n';
		}

		std::cerr << "::\n";

		for (int x = 0; x < W; ++x) // 左から x 列目
		{
			// 現在の列の合計値を出力
			std::cerr << colSums[x] << ' ';
		}

		std::cerr << "\n";
	}
	//
	//////////////////////////

	// 解答の出力
	for (int y = 0; y < H; ++y) // 上から y 行目
	{
		for (int x = 0; x < W; ++x) // 左から x 列目
		{
			// 現在の行の合計値 + 現在の列の合計値 - 現在のマス
			const int a = (rowSums[y] + colSums[x] - A[y * W + x]);

			std::cout << a << ' ';
		}

		std::cout << '\n';
	}
}