SRM440 div2
Tags: TopCoder
2009/05/12 21:54
久しぶりのTopcoder
あんまり緊張せずにできた。
problem 250
ただの数学の問題。式変形して重力加速度を求めましょう!という問題でした。
Math. cbrtとMath.sqrtを間違えて無駄な時間を食う。
なんかJavaに振り回されている気がする。
problem 500
定番の迷路問題をちょっとだけひねった問題。
最短経路の問題ではなく、分岐の数がいくつあるか求めよという問題。
でも、解法は再帰で1発。
だが、あとちょっとでsubmitできなかった。
250問題でバカなことしてなければ間に合ったと悔やむ。
終わってから通したらあっさり通りました。
あーあーあーあー
public class MazeWanderingEasy {
boolean atta = false;
int count = 0;
public int decisions(final String[] maze) {
int startx = 0, starty = 0;
String[][] m = new String[maze[0].length()][maze.length];
for (int i = 0; i < maze[0].length(); i++) {
for (int j = 0; j < maze.length; j++) {
m[i][j] = maze[j].substring(i, i + 1);
if (m[i][j].equals("M")) {
startx = i;
starty = j;
}
}
}
go(startx, starty, m, 0);
return this.count;
}
public int check(int x, int y, String[][] m) {
int check = 0;
if (x - 1 >= 0 && (m[x - 1][y].equals(".") || m[x - 1][y].equals("*"))) check++;
if (y - 1 >= 0 && (m[x][y - 1].equals(".") || m[x][y - 1].equals("*"))) check++;
if (x + 1 < m.length && (m[x + 1][y].equals(".") || m[x + 1][y].equals("*"))) check++;
if (y + 1 < m[0].length && (m[x][y + 1].equals(".") || m[x][y + 1].equals("*"))) check++;
return check;
}
public void go(int x, int y, String[][] m, int d){
wrap : if (!atta) {
if (m[x][y].equals("*")) {
atta = true;
this.count = d;
break wrap;
}
m[x][y] = "_";
if (check(x, y, m) > 1) d++;
System.out.println(d);
if (x - 1 >= 0 && (m[x - 1][y].equals(".") || m[x - 1][y].equals("*"))) go(x - 1, y, m, d);
if (y - 1 >= 0 && (m[x][y - 1].equals(".") || m[x][y - 1].equals("*"))) go(x, y - 1, m, d);
if (x + 1 < m.length && (m[x + 1][y].equals(".") || m[x + 1][y].equals("*"))) go(x + 1, y, m, d);
if (y + 1 < m[0].length && (m[x][y + 1].equals(".") || m[x][y + 1].equals("*"))) go(x, y + 1, m, d);
}
}
}
イチイチ2次元配列作ったり、同じソースがあったりする点が無駄だったと反省しています。
でもなー、せめて配列は組み直さないとバグでそうなんだよなぁー、俺の頭だと。
problem 1000
開けるわけがない~
経験不足が露呈。もったいないなぁー
次はもうちょっと頑張ります。
せめて緑ネームになりたいのです。
