TopCoder - SRM 425 DIV 2: 500
SRM 425 DIV 1: 250と同一問題。これ難しかった。とりあえずやっつけでやってみた。コードはこちら。312点…。問題は、東西南北自由に動き回るロボットが指定回数動いたときに、同じ地点に戻ってこない確率を求めるというもの。
public class CrazyBot { double we, ww, ws, wn; double total = 0.0; public double getProbability( int n, int east, int west, int south, int north) { int sum = east + west + south + north; we = east * 1.0 / sum; ww = west * 1.0 / sum; ws = south * 1.0 / sum; wn = north * 1.0 / sum; boolean flag[][] = new boolean[n*2+1][n*2+1]; move(flag, n, n, 1.0, n); return total; } public void move( boolean flag[][], int x, int y, double p, int n) { if (flag[x][y]) { return; } if (n < 0) { return; } if (n == 0) { total += p; return; } flag[x][y] = true; if (we > 0.0) { move(flag, x+1, y, p * we, n-1); } if (ww > 0.0) { move(flag, x-1, y, p * ww, n-1); } if (ws > 0.0) { move(flag, x, y-1, p * ws, n-1); } if (wn > 0.0) { move(flag, x, y+1, p * wn, n-1); } flag[x][y] = false; } }
コメント
コメントを投稿