#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';
}
}
二次元配列は一次元配列で表現することもできる。
例:
#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';
}
}