EPOCH@まつやま予選問題 問3 - カビの生えた雑記に便乗して。もう提出を締め切った後だから問題ないよね。あっちの回答よりも行数が多いのは何故だろう!
#include <stdio.h> /* サイコロの状態を表す構造体 */ struct { int top, right, near; } state = { 2, 1, 3 }; /* サイコロをX方向に回転させる */ void move_x(int x) { int tmp; /* 正の方向に回転 */ if (x >= 0) { while (x--) { tmp = state.top; state.top = 7 - state.near; state.near = tmp; } /* 負の方向に回転 */ } else { while (x++) { tmp = state.near; state.near = 7 - state.top; state.top = tmp; } } } /* サイコロをY方向に回転させる */ void move_y(int y) { int tmp; /* 正の方向に回転 */ if (y >= 0) { while (y--) { tmp = state.top; state.top = 7 - state.right; state.right = tmp; } /* 負の方向に回転 */ } else { while (y++) { tmp = state.right; state.right = 7 - state.top; state.top = tmp; } } } int main(void) { int n, i, d, x = 0, y = 0; char c; /* コマンド数の入力 */ scanf("%d", &n); if (n == 0) return 0; /* コマンドの解釈と実行 */ for (i = 0; i < n; i++) { scanf(" %c%d", &c, &d); if (c == 'x') { move_x(d); x += d; } else if (c == 'y') { move_y(d); y += d; } } /* 結果表示 */ printf("(%d,%d) ... %d\n", x, y, state.top); return 0; }
それなりに単純に書いたつもりだけど、1つずつサイコロを転がしてるから速度面では多少不安が残る。アルゴリズムは単純に、サイコロの対する面の和が7になる性質を用いた。ていうか、あんな単純な問題で上位20グループを絞れるのか、甚だ疑問。速度で判定するとか、そういう数値化された指標を使うならまだしも、判定基準が「見易さ・正確さ」だからなあ。