前回提示した問題は、パズル仲間のえぢナガタ提供のもの。彼の作品はペンシルケース、TriSheepなど。
プログラムの全体の構造をまとめてみるとこんな感じ。
void main()
{
回転装置 東、西、南、北、天、地;
回転装置6個を初期化(東、西、南、北、天、地);
本体を初期化(東、西、南、北、天、地);
int count=0;
for(;;){
回す(東); count++;
if(判定(東、西、南、北、天、地)){ break; }
回す(南); count++;
if(判定(東、西、南、北、天、地)){ break; }
回す(西); count++;
if(判定(東、西、南、北、天、地)){ break; }
回す(北); count++;
if(判定(東、西、南、北、天、地)){ break; }
}
結果表示(count);
}
最初、5040オペレーションという答えをはじき出した。デバッグもそこそこに、えぢナガタに結果を打診してみると、「それはセンターキューブの方向まで考えた場合の答え」だとの指摘が・・・。
見直してみる。
東
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
「灰色の部分は意味なし」と書きながらそこまで判定に入れていたのがまずかった。その点を直したら、めでたく1260オペレーションと答えが出た。それにしても長手数。
せっかく、仕組みができたので、ルービックキューブに関する別の問題を解いてみる予定。