RSS

 

RSS


 ルービックキューブに関しての簡単な問題1個をプログラムで解いてみようと思っている。今回はそれの準備、問題の内容は次回以降に提示予定。タイトルに書いてある〝ルキュ〟はルービックキューブの略。

 とりあえず、1層を回すシクミを考える。

 ここで、アイデアをひとつ。「立方体9個が回る」とするのではなくて「正方形が21枚が回る」としてみること。

 利点:立方体として扱うと位置の他に方向の情報が必要になるが、単色・絵なしの正方形ならば、その必要がない。

 「単純化されるのでいいじゃん」と思っている。立方体の向きをどうやって表すかという問題から解放される。実際に作っていく過程や全体的に出来たときに吟味。

 デバッグ用にはこんな感じに描いてみたい。従来は3×3とその横の面3×4個の部分的な展開図。

■■■

□□□
□□□
□□□
■■■

 アイデアをもうひとつ。その表示通り、
5×5の配列を使う。

 仮に正方形1個をSint32(32ビット符号付整数)で表すと、90度回転の関数はこんな感じ。XとYを取り替えて、片方の符号が反転する。

void  rot90(Sint32 dst[5][5],Sint32 src[5][5])
{
   for(Sint32 y=0;y<5;y++){
   for(Sint32 x=0;x<5;x++){
     dst[4-y][x]=src[x][y];
   }
   }
}

   試してみる。

void main(void)
{
  Sint32 s[5][5];
  Sint32 d[5][5];

  Sint32 num=0;
  for(Sint32 y=0;y<5;y++){
  for(Sint32 x=0;x<5;x++){
     s[x][y]=num;
     num++;
  }
  }

  disp(s);
  rot90(d,s);
  disp(d);
}

 実行結果は

 0  1  2  3  4
 5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24


20 15 10  5  0
21 16 11  6  1
22 17 12  7  2
23 18 13  8  3
24 19 14  9  4

これでこの件は完了。


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