FLYING

/* TODO: 気の利いた説明を書く */

epoch@まつやま 予選の問3 オレ的解答

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グループを絞れるのか、甚だ疑問。速度で判定するとか、そういう数値化された指標を使うならまだしも、判定基準が「見易さ・正確さ」だからなあ。