AOJ 1181 Biased Dice

制約条件

n≦100

方針

シミュレートする。
最初にサイコロの向きを24通り列挙しておく。

ソースコード

const int r[3][6] ={
	{3, 1, 0, 5, 4, 2},
	{1, 5, 2, 3, 0, 4},
	{0, 3, 1, 4, 2, 5}
};
set<vi> s;
vi rot(const vi &v, int d){
	vi res;
	rep(i, 6) res.pb(v[r[d][i]]);
	return res;
}
void dfs(const vi &v){
	if(s.count(v)) return;
	s.insert(v);
	rep(i, 3) dfs(rot(v, i));
}
const int dy[] = {1, 0, 0, -1}, dx[] = {0, 1, -1, 0};
int n, bl[100][100][100], h[100][100];

int main(){
	vi v;
	rep(i, 6) v.pb(i + 1);
	dfs(v);
	
	while(cin >> n, n){
		memset(h, 0, sizeof(h));
		
		rep(it, n){
			int t, f;
			cin >> t >> f;
			int y = 50, x = 50;
			vi v(6); v[0] = t; v[1] = f;
			v = *s.lower_bound(v);
			
			while(1){
				int mxd = -1;
				rep(d, 4){
					if(v[d + 1] < 4) continue;
					if(h[y + dy[d]][x + dx[d]] >= h[y][x]) continue;
					if(mxd < 0 || v[mxd + 1] < v[d + 1]) mxd = d;
				}
				if(mxd < 0){
					bl[y][x][h[y][x]++] = v[0];
					break;
				}
				if(mxd == 0) rep(i, 3) v = rot(v, 1);
				else if(mxd == 1) v = rot(v, 0);
				else if(mxd == 2) rep(i, 3) v = rot(v, 0);
				else v = rot(v, 1);
				y += dy[mxd];
				x += dx[mxd];
			}
		}
		int ans[6] = {};
		rep(i, 100) rep(j, 100) if(h[i][j]) ans[bl[i][j][h[i][j] - 1] - 1]++;
		rep(i, 6) cout << ans[i] << (i == 5 ? "\n" : " ");
	}
	return 0;
}

出展

ICPC国内予選2012 C