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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

1125閲覧

atcoder, begineersselection第十問traveling

cgen

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/09/23 09:24

前提・実現したいこと

https://atcoder.jp/contests/abs/tasks/arc089_a
の問題で、自分ではできた!と思ったのですが出力結果が予想と違ってしまい、コードのどこが間違っているのかわかりません。
一番初めの実行結果がYes、となるはずなのですが、Noとなってしまいます

問題文
シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。 AtCoDeerくんの旅行プランでは、時刻 0 に 点 (0,0) を出発し、 1 以上 N 以下の各 i に対し、時刻 tiに 点 (xi,yi) を訪れる予定です。

AtCoDeerくんが時刻 t に 点 (x,y) にいる時、 時刻 t+1 には 点 (x+1,y), (x−1,y), (x,y+1), (x,y−1) のうちいずれかに存在することができます。 その場にとどまることは出来ないことに注意してください。 AtCoDeerくんの旅行プランが実行可能かどうか判定してください。
制約
1 ≤ N ≤ 10^5
0 ≤ xi ≤ 10^5
0 ≤ yi ≤ 10^5
1 ≤ ti ≤ 10^5
ti​< ti+1(1 ≤ i ≤ N−1)
入力は全て整数
入力
入力は以下の形式で標準入力から与えられる。
N
t1 x1 y1
t2​ x2 y2
:
tN xN yN

出力
旅行プランが実行可能ならYesを、不可能ならNoを出力してください。

入力例 1
2
3 1 2
6 1 1
出力例 1
Yes
例えば、(0,0), (0,1), (1,1), (1,2), (1,1), (1,0), (1,1) と移動すればよいです。

入力例 2
1
2 100 100
出力例 2
No
(0,0) にいる状態から 2 秒後に (100,100) にいるのは不可能です。

入力例 3
2
5 1 1
100 1 1
出力例 3
No

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

oamke@DESKTOP-3PLG0UV ~/kyopuro/begineersselection $ gcc traveling.c oamke@DESKTOP-3PLG0UV ~/kyopuro/begineersselection $ ./a.exe 2 3 1 2 6 1 1 No oamke@DESKTOP-3PLG0UV ~/kyopuro/begineersselection $ ./a.exe 1 2 100 100 No oamke@DESKTOP-3PLG0UV ~/kyopuro/begineersselection $ ./a.exe 2 5 1 1 No

該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int travel(int t_old, int x_old, int y_old, int t, int x, int y){ 5 if((t-t_old)%2==0){ 6 if((x-x_old+y-y_old)%2==0){ 7 if(abs(x-x_old+y-y_old)<=t-t_old){return 0; 8 }else{return 1;} 9 }else{return 1;} 10 }else{ 11 if((x-x_old+y-y_old)%2==1){ 12 if(abs(x-x_old+y-y_old)<=t-t_old){return 0; 13 }else{return 1;} 14 }else{return 1;} 15 } 16} 17 18int main(){ 19 int i, n, t=0, t_old, x=0, x_old, y=0, y_old; 20 scanf("%d", &n); 21 for(i=0;i<n;i++){ 22 t_old=t; 23 x_old=x; 24 y_old=y; 25 scanf("%d %d %d", &t, &x, &y); 26 if(0!=travel(t_old, x_old, y_old, t, x, y)){ 27 printf("No"); 28 return 0; 29 } 30 } 31 printf("Yes"); 32 return 0; 33}

試したこと

入力でtの値を大きくしてみたり、x, yの偶奇を変えてみたのですが、いずれも次のようにNoと出力されてしまいました。

$ ./a.exe 2 3 1 2 7 1 1 No oamke@DESKTOP-3PLG0UV ~/kyopuro/begineersselection $ ./a.exe 2 3 1 2 100 1 1 No oamke@DESKTOP-3PLG0UV ~/kyopuro/begineersselection $ ./a.exe 2 3 1 2 6 1 0 No

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2021/09/23 09:42

まずコードの各所で各変数・計算結果がご自身が考えた通りの値になっているのかを確認しては如何でしょうか。
guest

回答2

0

ベストアンサー

if((x-x_old+y-y_old)%2==1){ ですが、
(x-x_old+y-y_old) が負の奇数の場合、2 で割った余りは 1 になりません。
==1!=0 にしてみてください。

それから、if(abs(x-x_old+y-y_old)<=t-t_old) という判定も間違っています。
次の入力を考えてみてください。
2
4 2 2
5 0 3

追記
いつのまにか解決済みになっていますが、どうやって解決したのかが書かれていません。
こんなやり方もあります。

C

1int travel(int t_old, int x_old, int y_old, int t, int x, int y) 2{ 3 int d = (t - t_old) - (abs(x - x_old) + abs(y - y_old)); 4 return d < 0 ? 1 : d & 1; 5}

投稿2021/09/23 14:48

編集2021/09/29 10:18
kazuma-s

総合スコア8224

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

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

0

C言語のコードを組むなら、デバッグ環境を揃えましょう
コードの任意の場所で実行を止めて、変数のナカミを見ることができます
また、1行づつ実行させて、動作を確認できます

Windowsなら、VisualStudio入れてみましょう

投稿2021/09/23 10:16

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問