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 :
http://www.iwai-masaka.jp/tb.cgi/405