円運動アルゴリズム – プログラミング – Home

通知
すべてクリア

[解決済] 円運動アルゴリズム


ちる
 ちる
(@ちる)
ゲスト
結合: 23年前
投稿: 77
Topic starter  

お世話になっております。
アルゴリズムに関してですがなかなかスマートな案が思いつかないので
良い方法があれば教えてください。

<仕様>
等間隔、時計回りで1~8までの番号の付いた1枚の円盤あります。
現在のポイント(任意)から指定した移動先に最短距離で移動します。
例えば「番号1」から「番号7」に移動したい場合、反時計回りで2つ進みます。

<一応考えたアルゴリズム>
1~4の場合と5~8の場合に分けて考える。

★1~4の場合
移動先が自分の数より大きい場合かつ対角上の点より小さい場合・・・時計回り移動
それ以外・・・反時計回り移動

★5~8の場合
移動先が自分の数より小さい場合かつ対角上の点より大きい場合・・・反時計回り移動
それ以外・・・時計回り移動

★何ステップ移動するか?
ここが思いつきません><

一応、移動する方向だけは出してみたのですが
どれぐらい進めばいいのかというところがうまく考え付きません。


引用未解決
トピックタグ
らふ
 らふ
(@らふ)
ゲスト
結合: 23年前
投稿: 18
 

らふです。

「移動先-現在地」(1) と
「現在地ー(移動先-8)」(2)
を比べて小さい方にその数分だけ進めばいいんじゃないですかね?
(マイナスがでたら無視)

(1)なら時計回り、(2)なら反時計回りに。
#はしょりすぎてちょっとわかりにくいかな…?

投稿の例(「番号1」から「番号7」に移動したい場合 ) でいうと、
(1) 7-1 = 6
(2) 1 - ( 7- 8 ) = 2
なので、反時計回りに二つ進むことになります。

プログラム的にはもっとスマートにかけそうです。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

こんな感じでどうでしょう。

現在位置: p
移動先: q
時計回り移動量 = (q - p + 8) % 8
反時計回り移動量 = (p - q + 8) % 8
ただし、位置は0~7です。


返信引用
ちる
 ちる
(@ちる)
ゲスト
結合: 23年前
投稿: 77
Topic starter  

ご回答ありがとうございます。

>>らふ様
いくつかパターンを試してみたところ
移動先の数が小さくかつ一週回るような数へ移動する場合は無理でした><

例えば7から1へ移動する場合です。
(1) 1 - 7 = -6
(2) 7 - (1 - 8) = 14
移動すべきは反時計回りに2ポイントなので・・・

>>dairygoods
いつもありがとうございます。
上記アルゴリズムに組み込んでみようと思います。

解決でっす!


返信引用
ちる
 ちる
(@ちる)
ゲスト
結合: 23年前
投稿: 77
Topic starter  

敬称忘れ^^;;

>>dairygoods様
ありがとうございました。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

dairygoodsさんのロジックでよいと思いますが。
>現在位置: p
>移動先: q
>時計回り移動量 = (q - p + 8) % 8
>反時計回り移動量 = (p - q + 8) % 8

最後に移動量の小さいほうに回転すればOKです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました