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