メモ
範囲for文
for (配列の要素の型 変数名 : 配列変数) { // 各要素に対する処理 }
多次元配列
vector<vector<要素の型>> 変数名(要素数1, vector<要素の型>(要素数2, 初期値))
参照
参照先の型 &参照の名前 = 参照先;
参照の参照(int a=3; int &b = a; int &c = b;)は、参照を参照ではなく直接参照になる。
関数宣言の引数を&参照にすると、関数で行った変更が参照先の変数も変更する。関数から外部変数を更新。
Ex19
#include <bits/stdc++.h> using namespace std; // 参照渡しを用いて、呼び出し側の変数の値を変更する void saiten(vector<vector<int>> &A, int &correct_count, int &wrong_count /* 呼び出し側に対応するように引数を書く */) { // 呼び出し側のAの各マスを正しい値に修正する for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (A.at(i).at(j) == (i + 1) * (j + 1)) { correct_count++; } else { wrong_count++; A.at(i).at(j) = (i + 1) * (j + 1); } } } // Aのうち、正しい値の書かれたマスの個数を correct_count に入れる // Aのうち、誤った値の書かれたマスの個数を wrong_count に入れる // ここにプログラムを追記 } // ------------------- // ここから先は変更しない // ------------------- int main() { // A君の回答を受け取る vector<vector<int>> A(9, vector<int>(9)); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cin >> A.at(i).at(j); } } int correct_count = 0; // ここに正しい値のマスの個数を入れる int wrong_count = 0; // ここに誤った値のマスの個数を入れる // A, correct_count, wrong_countを参照渡し saiten(A, correct_count, wrong_count); // 正しく修正した表を出力 for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cout << A.at(i).at(j); if (j < 8) cout << " "; else cout << endl; } } // 正しいマスの個数を出力 cout << correct_count << endl; // 誤っているマスの個数を出力 cout << wrong_count << endl; }
Ex18
#include <bits/stdc++.h> using namespace std; int main() { int N, M; cin >> N >> M; vector<int> A(M), B(M); for (int i = 0; i < M; i++) { cin >> A.at(i) >> B.at(i); } vector<vector<char>> score(N, vector<char>(N)); for (int i = 0; i < N; i++) { for (int n = 0; n < N; n++) { score.at(i).at(n) = '-'; } } for (int i = 0; i < M; i++) { score.at(A.at(i) - 1).at(B.at(i) - 1) = 'o'; score.at(B.at(i) - 1).at(A.at(i) - 1) = 'x'; } for (int i = 0; i < N; i++) { for (int n = 0; n < N; n++) { cout << score.at(i).at(n); if (n + 1 < N) { cout << ' '; } } cout << endl; } return 0; }
Ex17
#include <bits/stdc++.h> using namespace std; int main() { int N, S; cin >> N >> S; vector<int> A(N), P(N); int count = 0; for (int i = 0; i < N; i++) { cin >> A.at(i); } for (int i = 0; i < N; i++) { cin >> P.at(i); } for (int i = 0; i < N; i++) { for (int n = 0; n < N; n++) { if (A.at(i) + P.at(n) == S) { count++; } } } cout << count << endl; }
Ex16
#include <bits/stdc++.h> using namespace std; int main() { vector<int> data(5); for (int i = 0; i < 5; i++) { cin >> data.at(i); } bool equal = false; for (int i = 0; i < 4; i++) { if ((data.at(i) - data.at(i + 1)) == 0) { equal = true; } } if (equal) { cout << "YES" << endl; } else if (!equal) { cout << "NO" << endl; } // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する // ここにプログラムを追記 }