前置き
こんにちは。
最近競技プログラミングを
こちら(Atcoder)のページで勉強しています。
その中の2次元配列の問題で質問があります。
#質問したいこと
2次元配列の問題の一番下のページに、回答サンプルがあるのですが、このプログラムの
C++
1for (int i = 0; i < M; i++) { 2 // 1〜N → 0〜N-1 に変換 3 A.at(i)--; B.at(i)--; 4 table.at(A.at(i)).at(B.at(i)) = 'o'; // AはBに勝った 5 table.at(B.at(i)).at(A.at(i)) = 'x'; // BはAに負けた 6}
の部分が分からないです。特に、
C++
1 // 1〜N → 0〜N-1 に変換 2 A.at(i)--; B.at(i)--; 3
が分からないです。
このコードを入れずに実行すると、
terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 3) >= this->size() (which is 3)
というエラーが出てきます。
これは、配列の数よりも大きい値にアクセスしようとしてしまっているため、
出てきてしまうエラーだと思うのですが、なぜこのエラーが出てしまうのかも理解ができていません。
#コード
解答全体のコードです。
C++
1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int N, M; 6 cin >> N >> M; 7 vector<int> A(M), B(M); 8 for (int i = 0; i < M; i++) { 9 cin >> A.at(i) >> B.at(i); 10 } 11 12 // N×Nのchar型の2次元配列のすべての要素を'-'で初期化 13 vector<vector<char>> table(N, vector<char>(N, '-')); 14 15 16 /*この部分が質問箇所です。*/ 17 for (int i = 0; i < M; i++) { 18 // 1〜N → 0〜N-1 に変換 19 A.at(i)--; B.at(i)--; 20 table.at(A.at(i)).at(B.at(i)) = 'o'; // AはBに勝った 21 table.at(B.at(i)).at(A.at(i)) = 'x'; // BはAに負けた 22 } 23 24 for (int i = 0; i < N; i++) { 25 for (int j = 0; j < N; j++) { 26 cout << table.at(i).at(j); 27 if (j == N - 1) { 28 cout << endl; // 行末なら改行 29 } 30 else { 31 cout << " "; // 行末でないなら空白を出力 32 } 33 } 34 } 35} 36
初心者なので、詳しく教えていただけると幸いです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー