結果
問題 | No.331 CodeRunnerでやれ |
ユーザー | uwi |
提出日時 | 2015-12-17 22:20:37 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 1,360 ms / 5,000 ms |
コード長 | 3,763 bytes |
コンパイル時間 | 3,614 ms |
コンパイル使用メモリ | 82,552 KB |
実行使用メモリ | 75,004 KB |
平均クエリ数 | 236.59 |
最終ジャッジ日時 | 2024-07-16 22:05:07 |
合計ジャッジ時間 | 17,805 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 260 ms
58,168 KB |
testcase_01 | AC | 326 ms
64,644 KB |
testcase_02 | AC | 512 ms
67,776 KB |
testcase_03 | AC | 476 ms
66,752 KB |
testcase_04 | AC | 569 ms
68,132 KB |
testcase_05 | AC | 499 ms
66,952 KB |
testcase_06 | AC | 908 ms
70,484 KB |
testcase_07 | AC | 702 ms
69,324 KB |
testcase_08 | AC | 557 ms
68,188 KB |
testcase_09 | AC | 1,103 ms
73,248 KB |
testcase_10 | AC | 900 ms
70,200 KB |
testcase_11 | AC | 684 ms
69,820 KB |
testcase_12 | AC | 806 ms
70,324 KB |
testcase_13 | AC | 642 ms
70,152 KB |
testcase_14 | AC | 971 ms
72,564 KB |
testcase_15 | AC | 1,017 ms
72,140 KB |
testcase_16 | AC | 1,360 ms
75,004 KB |
ソースコード
package writer; import java.io.PrintWriter; import java.util.ArrayDeque; import java.util.Arrays; import java.util.Queue; import java.util.Scanner; public class FromClosestSubmission { static Scanner in; static PrintWriter out; static String INPUT = ""; static int n = 105, m = 105; static int[] dr = { 1, 0, -1, 0 }; static int[] dc = { 0, 1, 0, -1 }; static void solve() { char[][] map = new char[n][m]; int r = 52, c = 52; map[r][c] = '.'; int dir = 0; while(true){ int dist = read(); if(dist > 100 || dist == -1){ // found the goal while(dist != -1){ out.println("F"); out.flush(); dist = read(); } return; } for(int i = 0, vr = r, vc = c;i <= dist;i++, vr += dr[dir], vc += dc[dir]){ map[vr][vc] = '.'; } map[r+(dist+1)*dr[dir]][c+(dist+1)*dc[dir]] = '#'; int[] closest = closestUnknown(r, c, dir, map); if(closest[2] == 1){ r += dr[dir]; c += dc[dir]; }else if(closest[2] == 2){ r -= dr[dir]; c -= dc[dir]; }else if(closest[2] == 3){ dir = dir+1&3; }else if(closest[2] == 4){ dir = dir+3&3; } out.println("FBLR".charAt(closest[2]-1)); out.flush(); } } static int read() { String z = in.next(); if(z.charAt(0) >= '0' && z.charAt(0) <= '9')return Integer.parseInt(z); return -1; } static int[] closestUnknown(int sr, int sc, int sdir, char[][] map) { int[][][] d = new int[n][m][4]; int[][][] prev = new int[n][m][4]; Queue<int[]> q = new ArrayDeque<>(); int I = 99999999; for(int i = 0;i < n;i++){ for(int j = 0;j < m;j++){ for(int k = 0;k < 4;k++){ d[i][j][k] = I; prev[i][j][k] = -1; } } } q.add(new int[]{sr, sc, sdir}); d[sr][sc][sdir] = 0; while(!q.isEmpty()){ int[] cur = q.poll(); int r = cur[0], c = cur[1], dir = cur[2]; if(map[r][c] == 0){ int vr = r, vc = c, vdir = dir; int last = -2; while(prev[vr][vc][vdir] != -1){ last = prev[vr][vc][vdir]; if(prev[vr][vc][vdir] == 1){ vr -= dr[vdir]; vc -= dc[vdir]; }else if(prev[vr][vc][vdir] == 2){ vr += dr[vdir]; vc += dc[vdir]; }else if(prev[vr][vc][vdir] == 3){ vdir = vdir+3&3; }else if(prev[vr][vc][vdir] == 4){ vdir = vdir+1&3; } } return new int[]{r, c, last}; } // forward { int nr = r + dr[dir], nc = c + dc[dir], ndir = dir; if(d[nr][nc][ndir] > d[r][c][dir] + 1 && map[nr][nc] != '#'){ d[nr][nc][ndir] = d[r][c][dir] + 1; prev[nr][nc][ndir] = 1; q.add(new int[]{nr, nc, ndir}); } } // // backward // { // int nr = r - dr[dir], nc = c - dc[dir], ndir = dir; // if(d[nr][nc][ndir] > d[r][c][dir] + 1){ // d[nr][nc][ndir] = d[r][c][dir] + 1; // prev[nr][nc][ndir] = 2; // q.add(new int[]{nr, nc, ndir}); // } // } // rotate left { int nr = r, nc = c, ndir = dir+1&3; if(d[nr][nc][ndir] > d[r][c][dir] + 1){ d[nr][nc][ndir] = d[r][c][dir] + 1; prev[nr][nc][ndir] = 3; q.add(new int[]{nr, nc, ndir}); } } // rotate right { int nr = r, nc = c, ndir = dir+3&3; if(d[nr][nc][ndir] > d[r][c][dir] + 1){ d[nr][nc][ndir] = d[r][c][dir] + 1; prev[nr][nc][ndir] = 4; q.add(new int[]{nr, nc, ndir}); } } } return null; } public static void main(String[] args) throws Exception { in = INPUT.isEmpty() ? new Scanner(System.in) : new Scanner(INPUT); out = new PrintWriter(System.out); solve(); out.flush(); } static int ni() { return Integer.parseInt(in.next()); } static long nl() { return Long.parseLong(in.next()); } static double nd() { return Double.parseDouble(in.next()); } static void tr(Object... o) { if(INPUT.length() != 0)System.out.println(Arrays.deepToString(o)); } }