前提・実現したいこと
以下をご教授お願い致します。
・配列は左辺値ではないため左辺に持ってきてはならないのは理解した。しかし、それならば、下記の正しいソースコードでも同様に、if文の条件式の左辺に配列であるdt,distを持ってくるとエラーするはずではないのか。違いを生む理由は何か。
・”21行目、canは定義されていない識別子であること。”というエラーメッセージを得たが、canは13行目で定義しているはずである。理解に苦しむ。
・これらを踏まえた上で、ソースコードを訂正するならばどのようになるか。入門者であるため、普遍的な教訓まで教えていただけると非常にありがたい。
問題文
シカの AtCoDeer くんは二次元平面上で旅行をしようとしています。AtCoDeer くんの旅行プランでは、時刻 0 に 点 (0,0) を出発し、1 以上 N 以下の各 i に対し、時刻 tiに 点 (xi,yi) を訪れる予定です。
AtCoDeer くんが時刻 ti,ti+1 に 点 (xi,yi)(xi+1,yi+1) にいる時、 時刻 ti+1には 点(x+1,y),(x−1,y),(x,y+1),(x,y−1) のうちいずれかに存在することができます。その場にとどまることは出来ないことに注意してください。AtCoDeer くんの旅行プランが実行可能かどうか判定してください。
発生している問題・エラーメッセージ
・16行目、if文の条件式において、配列であるdt,dsが左辺にあること。
・21行目、canは定義されていない識別子であること。
該当のソースコード
C++
1自分が書いた誤ったソースコード 2 3include <iostream> 4using namespace std; 5 6int main() { 7 int N, i; 8 int t[100000], x[100000], y[100000]; 9 cin >> N; 10 t[0] = x[0] = y[0] = 0; 11 for (i = 0; i < N; i++) { 12 cin >> t[i + 1] >> x[i + 1] >> y[i + 1]; 13 } 14 for (i = 0; i < N; i++) { 15 int can = 1; 16 int dt = t[i + 1] - t[i]; 17 int ds = abs(x[i + 1] - x[i]) + abs(y[i + 1] - y[i]); 18 if ((dt - ds) % 2 = 0 && dt >= ds) { 19 can = 0; 20 } 21 else { break; } 22 } 23 if (can) { cout << "Yes"; } 24 else { cout << "No"; } 25 return 0; 26} 27 28### 正しい(正解の一例)ソースコード 29include <iostream> 30using namespace std; 31 32int main() { 33 int N; 34 int t[110000], x[110000], y[110000]; 35 cin >> N; 36 t[0] = x[0] = y[0] = 0; // 初期状態 37 for (int i = 0; i < N; ++i) cin >> t[i+1] >> x[i+1] >> y[i+1]; // 1-index にしておく 38 39 bool can = true; 40 for (int i = 0; i < N; ++i) { 41 int dt = t[i+1] - t[i]; 42 int dist = abs(x[i+1] - x[i]) + abs(y[i+1] - y[i]); 43 if (dt < dist) can = false; 44 if (dist % 2 != dt % 2) can = false; // dist と dt の偶奇は一致する必要あり! 45 } 46 47 if (can) cout << "Yes" << endl; 48 else cout << "No" << endl; 49}
回答3件
あなたの回答
tips
プレビュー