条件式について (初心者)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
とけい

条件式について (初心者)

#1

投稿記事 by とけい » 9年前

条件式についてご教示ください。

フィールド状態を表す2次配列 f[y][x]が -1(空)の場合、
1(x1,y1)をy方向へ進める。但し、1が進む先に2(x2,y2)がいた場合はその手前まで進む のような
プログラムを組みたいのですが、以下のような条件式にすると1と2のx座標が違う時も、いつも手前で止まります
(当然、そうなるのは判ります)。

コード:

 for(int i=0; i<20; i+;){
 if (f[y1 + 1][x1] == -1 && ( (y1 + 1) != y2) )  y1++;
}
なので、
f[y][x]が -1(空)の場合、x1とx2が同じかつ、1が進む先yに2がいない場合、1をy方向へ進める。
と言うのを「直観的」に書くと以下の様になりました。が、こちらも1と2のx座標が違う場合、一切進みません。
(当然の様な気もしますが、この辺りで頭がおかしくなります)。

コード:

 for(int i=0; i<20; i+;){
 if (f[y1 + 1][x1] == -1 && ((x1 == x2) && (y1 + 1) != y2 ) ) y1++;
}
このような条件の場合は、以下の様に書くしかないのでしょうか。

コード:

 for(int i=0; i<20; i+;){
 if (f[y1 + 1][x1] == -1){
   y1++;
  if ((x1 == x2) && (y1 + 1) != y2 ) y1--;
 }
}
なにか、歯痒いといいますか、、
もう少しスマートな書き方にしたいのですが、
ご教示の程、よろしくお願い致します。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 条件式について (初心者)

#2

投稿記事 by みけCAT » 9年前

整理しましょう。
  • 進みたい先が-1(空)の場合、y1をインクリメントする。
  • ただし、インクリメントした結果y2と同じになってしまうなら、インクリメントしない。
  • ただし、x1とx2が等しくないなら、y2にかかわらずインクリメントしてよい。
従って、例えばこのように書けます。

コード:

for(int i=0; i<20; i++){
 if (f[y1 + 1][x1] == -1 && ( x1 != x2 || (y1 + 1) != y2) )  y1++;
}
参考:グレゴリオ暦の閏年の判定
  • yearが4の倍数なら、閏年である。
  • ただし、yearが100の倍数なら、閏年ではない。
  • ただし、yearが400の倍数なら、やっぱり閏年である。

コード:

year % 4 == 0 && (year % 400 == 0 || year % 100 != 0)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

とけい

Re: 条件式について (初心者)

#3

投稿記事 by とけい » 9年前

ご教示頂いた条件文で、所望の動作を確認しました。
ありがとうございます。

基本的な事のように感じるのに、理解するのにかなり時間がかかりました(汗)。

ちなみに
if (f[y1 + 1][x1] == -1 && !( x1 == x2 && (y1 + 1) == y2) ) y1++;
でも同様の判定が出来ていますでしょうか。

自信がないので、ご教示いただけますと幸いです。

(トピックとしては解決とします、ありがとうございました。)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 条件式について (初心者)

#4

投稿記事 by みけCAT » 9年前

とけい さんが書きました:ちなみに
if (f[y1 + 1][x1] == -1 && !( x1 == x2 && (y1 + 1) == y2) ) y1++;
でも同様の判定が出来ていますでしょうか。
前半は同じ式、後半はド・モルガンの法則により等価なので、正しいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る