質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1340閲覧

第一回 アルゴリズム実技検定 過去問 E SNSのログ なぜREに

Tala_Chang

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/10/13 16:26

前提・実現したいこと

なぜREになるのか教えてください。
(第一回 アルゴリズム実技検定 過去問 E SNSのログ)

発生している問題・エラーメッセージ

28のテストケースのうち、21個のケースにおいて実行時エラーになります。

該当のソースコード

C++

1#include <bits/stdc++.h> 2using namespace std; 3typedef long long ll; 4int main() { 5 ll N, Q; cin>> N>> Q; 6 vector<string> S(Q); 7 for(int i=0; i < Q; i++){ 8 cin>> S.at(i); 9 if(S.at(i) == "1"){ 10 char a; 11 char b; 12 cin>> a>> b; 13 S.at(i) += a; 14 S.at(i) += b; 15 } 16 else { 17 char a; 18 cin>> a; 19 S.at(i) += a; 20 } 21 } 22 vector<vector<char>> f(N, vector<char>(N, 'N')); 23 for(int i=0; i < Q; i++){ 24 string s = S.at(i); 25 if(s.at(0) == '1'){ 26 int A = (int)(s.at(1) - '0'); 27 int B = (int)(s.at(2) - '0'); 28 f.at(A-1).at(B-1) = 'Y'; 29 } 30 else if(s.at(0) == '2'){ 31 int A = (int)(s.at(1) - '0'); 32 vector<int> memory; 33 for(int j=0; j < N; j++){ 34 if(f.at(j).at(A-1) == 'Y'){ 35 memory.push_back(j+1); 36 } 37 } 38 for(int x : memory){ 39 f.at(A-1).at(x-1) = 'Y'; 40 } 41 } 42 else if(s.at(0) == '3'){ 43 vector<int> memory; 44 int A = (int)(s.at(1) - '0'); 45 for(int j=0; j < N; j++){ 46 if(f.at(A-1).at(j) == 'Y'){ 47 memory.push_back(j+1); 48 } 49 } 50 for(int x : memory){ 51 for(int j=0; j < N; j++){ 52 if(f.at(x - 1).at(j) == 'Y'){ 53 f.at(A-1).at(j) = 'Y'; 54 } 55 } 56 } 57 } 58 } 59 for(int i=0; i < N; i++)f.at(i).at(i) = 'N'; 60 for(int i=0; i < N; i++){ 61 for(int j=0; j < N; j++){ 62 cout<< f.at(i).at(j); 63 if(j >= N-1)cout<< endl; 64 } 65 } 66}

試したこと

AtCoderでコードテストを行った限りでは、正常に動いています。

補足情報(FW/ツールのバージョンなど)

C++の(GCC 9.2.1)です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

入力の受け取り方が間違っています。制約は 1≤N≤100、1≤a,b≤N なので、a,bには当然2桁や3桁の整数も入ります。それを1文字しか格納できないchar型に代入しようとしているので、エラーが発生します。

今回ならば、ログの内容を格納する配列の型にはvector<vector<int>>を使うと良いでしょう。

コード例:
https://atcoder.jp/contests/past201912-open/submissions/26722965

C++

1#include <bits/stdc++.h> 2using namespace std; 3typedef long long ll; 4int main() { 5 ll N, Q; cin>> N>> Q; 6 vector<vector<int>> S(Q, vector<int>(3)); 7 for(int i=0; i < Q; i++){ 8 cin>> S.at(i).at(0); 9 if(S.at(i).at(0) == 1){ 10 cin>> S.at(i).at(1)>> S.at(i).at(2); 11 } 12 else { 13 cin>> S.at(i).at(1); 14 } 15 } 16 vector<vector<char>> f(N, vector<char>(N, 'N')); 17 for(int i=0; i < Q; i++){ 18 vector<int> s = S.at(i); 19 if(s.at(0) == 1){ 20 int A = s.at(1); 21 int B = s.at(2); 22 f.at(A-1).at(B-1) = 'Y'; 23 } 24 else if(s.at(0) == 2){ 25 int A = s.at(1); 26 vector<int> memory; 27 for(int j=0; j < N; j++){ 28 if(f.at(j).at(A-1) == 'Y'){ 29 memory.push_back(j+1); 30 } 31 } 32 for(int x : memory){ 33 f.at(A-1).at(x-1) = 'Y'; 34 } 35 } 36 else if(s.at(0) == 3){ 37 vector<int> memory; 38 int A = s.at(1); 39 for(int j=0; j < N; j++){ 40 if(f.at(A-1).at(j) == 'Y'){ 41 memory.push_back(j+1); 42 } 43 } 44 for(int x : memory){ 45 for(int j=0; j < N; j++){ 46 if(f.at(x - 1).at(j) == 'Y'){ 47 f.at(A-1).at(j) = 'Y'; 48 } 49 } 50 } 51 } 52 } 53 for(int i=0; i < N; i++)f.at(i).at(i) = 'N'; 54 for(int i=0; i < N; i++){ 55 for(int j=0; j < N; j++){ 56 cout<< f.at(i).at(j); 57 if(j >= N-1)cout<< endl; 58 } 59 } 60}

​補足

コードの書き方で気になった点が2つあったので、一応補足として書いておきます。

1つ目は配列の要素の取得方法です。Tala_Changさんのコードでは配列fのi番目を取得するのにf.at(i)と書いてありますが、これはf[i]と書いたほうが、文字数も少なくなりますし、要素を取得していることが分かりやすくなります。文字列(string型)のi文字目を取得する場合も同様です。

2つ目は配列fの型です。Tala_Changさんのコードではvector<vector<char>>となっていますが、これはvector<string>で代用できます。こうすると、最後に配列fの内容を出力するときに1重のfor文だけで済みます(コード例参照)。今回のように文字が長方形に敷き詰められたタイプの情報を入力・出力するときは、vector<string>を使うと簡単です。

コード例:
https://atcoder.jp/contests/past201912-open/submissions/26723354

C++

1#include <bits/stdc++.h> 2using namespace std; 3typedef long long ll; 4 5int main() { 6 int N, Q; 7 cin >> N >> Q; 8 vector<vector<int>> S(Q, vector<int>(3)); 9 for (int i = 0; i < Q; i++) { 10 cin >> S[i][0]; 11 if (S[i][0] == 1) { 12 cin >> S[i][1] >> S[i][2]; 13 } 14 else { 15 cin >> S[i][1]; 16 } 17 } 18 19 vector<string> f(N, string(N, 'N')); 20 for (int i = 0; i < Q; i++) { 21 vector<int> s = S[i]; 22 if (s[0] == 1) { 23 int A = s[1]; 24 int B = s[2]; 25 f[A - 1][B - 1] = 'Y'; 26 } 27 else if (s[0] == 2) { 28 int A = s[1]; 29 vector<int> memory; 30 for (int j = 0; j < N; j++) { 31 if (f[j][A - 1] == 'Y') { 32 memory.push_back(j + 1); 33 } 34 } 35 for (int x : memory) { 36 f[A - 1][x - 1] = 'Y'; 37 } 38 } 39 else if (s[0] == 3) { 40 int A = s[1]; 41 vector<int> memory; 42 for (int j = 0; j < N; j++) { 43 if (f[A - 1][j] == 'Y') { 44 memory.push_back(j + 1); 45 } 46 } 47 for (int x : memory) { 48 for (int j = 0; j < N; j++) { 49 if (A - 1 != j && f[x - 1][j] == 'Y') { 50 f[A - 1][j] = 'Y'; 51 } 52 } 53 } 54 } 55 } 56 57 for (int i = 0; i < N; i++) { 58 cout << f[i] << endl; 59 } 60}

投稿2021/10/21 18:13

luuguas

総合スコア492

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問