読者です 読者をやめる 読者になる 読者になる

FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

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

c/c++

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