AOJ 1181: Biased Dice
問題
Biased Dice | Aizu Online Judge
解法
問題の通りにシミュレーション。
nが100までなので、適当にリストでも作っておいてサイコロを投げ入れていけば良い。
バグらせることなく実装できてよかった。
import java.util.*; import java.io.*; import java.awt.geom.*; import java.math.*; public class AOJ1181 { static final Scanner in = new Scanner(System.in); static final PrintWriter out = new PrintWriter(System.out,false); static boolean debug = false; static int[] dx = { 0, 1, 0,-1}; static int[] dy = { 1, 0,-1, 0}; @SuppressWarnings("unchecked") static void rec(ArrayList[][] list, Dice d, int y, int x) { int dir = -1, max = 0; for (int k=0; k<4; k++) { int ny = y + dy[k]; int nx = x + dx[k]; if (d.face[k] >= 4 && list[ny][nx].size() < list[y][x].size() && max < d.face[k]) { max = d.face[k]; dir = k; } } if (dir == -1) { list[y][x].add(d); } else { d.rotate(dir); rec(list, d, y + dy[dir], x + dx[dir]); } } @SuppressWarnings("unchecked") static boolean solve() { int n = in.nextInt(); if (n == 0) return false; ArrayList<Dice>[][] list = new ArrayList[100][100]; for (int i=0; i<100; i++) { for (int j=0; j<100; j++) { list[i][j] = new ArrayList<Dice>(); } } for (int i=0; i<n; i++) { int t = in.nextInt(); int f = in.nextInt(); rec(list, new Dice(t, f), 50, 50); } int[] cnt = new int[6]; for (int i=0; i<100; i++) { for (int j=0; j<100; j++) { if (list[i][j].size() > 0) { Dice d = list[i][j].get(list[i][j].size()-1); cnt[d.face[Dice.TOP] - 1]++; } } } for (int i=0; i<5; i++) { out.print(cnt[i] + " "); } out.println(cnt[5]); return true; } public static void main(String[] args) { debug = args.length > 0; long start = System.currentTimeMillis(); while(solve()); out.flush(); long end = System.currentTimeMillis(); dump((end-start) + "ms"); in.close(); out.close(); } static void dump(Object... o) { if (debug) System.err.println(Arrays.deepToString(o)); } } class Dice implements Cloneable{ public static final int TOP = 4; public static final int BOTTOM = 5; public static final int FRONT = 2; public static final int BACK = 0; public static final int LEFT = 3; public static final int RIGHT = 1; public static final int[][] roll = { {TOP,FRONT,BOTTOM,BACK},//+y {TOP,LEFT,BOTTOM,RIGHT},//+x {TOP,BACK,BOTTOM,FRONT},//-y {TOP,RIGHT,BOTTOM,LEFT},//-x {FRONT,RIGHT,BACK,LEFT},//cw {FRONT,LEFT,BACK,RIGHT},//ccw }; public static final int[] dx = {1,0,-1,0}; public static final int[] dy = {0,1,0,-1}; final int[] face; public Dice() { this.face = new int[6]; this.face[TOP] = 1; this.face[BOTTOM] = 6; this.face[FRONT] = 2; this.face[BACK] = 5; this.face[LEFT] = 4; this.face[RIGHT] = 3; } public Dice(int top, int front) { this.face = new int[6]; this.face[TOP] = top; this.face[FRONT] = front; this.face[BOTTOM] = 7 - top; this.face[BACK] = 7 - front; if (top == 1 && front == 2) { this.face[LEFT] = 4; this.face[RIGHT] = 3; } else if (top == 1 && front == 3) { this.face[LEFT] = 2; this.face[RIGHT] = 5; } else if (top == 1 && front == 4) { this.face[LEFT] = 5; this.face[RIGHT] = 2; } else if (top == 1 && front == 5) { this.face[LEFT] = 3; this.face[RIGHT] = 4; } else if (top == 2 && front == 1) { this.face[LEFT] = 3; this.face[RIGHT] = 4; } else if (top == 2 && front == 3) { this.face[LEFT] = 6; this.face[RIGHT] = 1; } else if (top == 2 && front == 4) { this.face[LEFT] = 1; this.face[RIGHT] = 6; } else if (top == 2 && front == 6) { this.face[LEFT] = 4; this.face[RIGHT] = 3; } else if (top == 3 && front == 1) { this.face[LEFT] = 5; this.face[RIGHT] = 2; } else if (top == 3 && front == 2) { this.face[LEFT] = 1; this.face[RIGHT] = 6; } else if (top == 3 && front == 5) { this.face[LEFT] = 6; this.face[RIGHT] = 1; } else if (top == 3 && front == 6) { this.face[LEFT] = 2; this.face[RIGHT] = 5; } else if (top == 4 && front == 1) { this.face[LEFT] = 2; this.face[RIGHT] = 5; } else if (top == 4 && front == 2) { this.face[LEFT] = 6; this.face[RIGHT] = 1; } else if (top == 4 && front == 5) { this.face[LEFT] = 1; this.face[RIGHT] = 6; } else if (top == 4 && front == 6) { this.face[LEFT] = 5; this.face[RIGHT] = 2; } else if (top == 5 && front == 1) { this.face[LEFT] = 4; this.face[RIGHT] = 3; } else if (top == 5 && front == 3) { this.face[LEFT] = 1; this.face[RIGHT] = 6; } else if (top == 5 && front == 4) { this.face[LEFT] = 6; this.face[RIGHT] = 1; } else if (top == 5 && front == 6) { this.face[LEFT] = 3; this.face[RIGHT] = 4; } else if (top == 6 && front == 2) { this.face[LEFT] = 3; this.face[RIGHT] = 4; } else if (top == 6 && front == 3) { this.face[LEFT] = 5; this.face[RIGHT] = 2; } else if (top == 6 && front == 4) { this.face[LEFT] = 2; this.face[RIGHT] = 5; } else if (top == 6 && front == 5) { this.face[LEFT] = 4; this.face[RIGHT] = 3; } } public Dice(int[] nums) { this.face = nums.clone(); } public void rotate(int dir) { int temp = face[roll[dir][0]]; for (int i=0; i<3; i++) { face[roll[dir][i]] = face[roll[dir][i+1]]; } face[roll[dir][3]] = temp; } static void swap(Dice d1, Dice d2) { for (int i=0; i<6; i++) { int temp = d1.face[i]; d1.face[i] = d2.face[i]; d2.face[i] = temp; } } public boolean equals(Dice d) { return this.face[TOP] == d.face[TOP] && this.face[BOTTOM] == d.face[BOTTOM] && this.face[FRONT] == d.face[FRONT] && this.face[BACK] == d.face[BACK] && this.face[LEFT] == d.face[LEFT] && this.face[RIGHT] == d.face[RIGHT]; } public String toString() { return Arrays.toString(face); } @Override public Dice clone() { return new Dice(this.face); } }