RSS

 

RSS


今までの記事は
プ:ルキュを解く その1 http://www.iwai-masaka.jp/256.shtml
プ:ルキュを解く その2 http://www.iwai-masaka.jp/327.shtml
ルキュはルービックキューブの略。


解きたい問題:
 ルービックキューブが揃った状態である。
 東面を左回転90度、南面を左回転90度、
 西面を左回転90度、北面を左回転90度
 東面を左回転90度、南面を左回転90度、
 西面を左回転90度、北面を左回転90度
 ・・・・・
 とオペレーションを繰り返していくとき、いつまた揃った状態に戻るか?


■ネタ3-1:データを5×5×5で持つ
 意味的にデータを5×5×5で持つことにした。3×3×3のルービックキューブの各正方形54枚に同じ色の立方体54個をボンドで貼り付けていった感じ。これで、54個の色立方体は3次元のインデックスで一意に表せる。5×5×5=125個のうちの54個が有効ということになる。mokkori.jpg

■ネタ3-2:3次元インデックスを統合id
 3次元のインデックスを(x,y,z)→id=x*100+y*10+zで管理。扱う変数が3個から1個に減って軽めになる。printf("%03d",id);と出力すると直接値が見れて便利。10進法でわかるってことはデバッガ上でも役に立つ。

■ネタ3-3:統合idのままアクセスできるもとデータ
 1000個(*1)の配列を作ってデータとする。int data[1000]; 統合idを使ってdata[統合id]と直接アクセスできる。1000個中54個のみ有効な値。

■ネタ3-4:アクセスは0~4で
 ネタ3-2、ネタ3-3に関しては、-2~2アクセスでなく、0~4アクセスの方が調子がよさそう。

 ※ネタ2-3、ネタ2-5は、適用中止。

■ネタ3-5:各面回転装置からの見た目
 各面回転装置からの見た目(つまりアクセス先)を実際に見てみてあってるかどうか確認。

ソースはcube_mitame.cpp
100の位が東西、10の位が南北、1の位が天地
出力結果は

東
100 110 120 130 140  ピンクは一段向こう側(100の位が1)。
101 011 021 031 141  灰色は意味なし部分。
102 012 022 032 142
103 013 023 033 143
104 114 124 134 144

西
340 330 320 310 300  東面と西面では南北(10の位)が逆になる。
341 431 421 411 301
342 432 422 412 302
343 433 423 413 303
344 334 324 314 304

南
010 110 210 310 410
011 101 201 301 411
012 102 202 302 412
013 103 203 303 413
014 114 214 314 414

北
430 330 230 130 030
431 341 241 141 031
432 342 242 142 032
433 343 243 143 033
434 334 234 134 034

 〝その4〟に続く。

*1 記事を書いていてdataの配列の個数は1000も必要でなくて、445あれば大丈夫だということに気付いた。リベンジキューブ、プロフェッサーキューブ・・・、8×8×8キューブまでは解ける?


  • コメント (0)
  • トラックバック (0)
トラックバックURL :
https://www.iwai-masaka.jp/tb.cgi/405