結果
問題 | No.331 CodeRunnerでやれ |
ユーザー | uwi |
提出日時 | 2015-12-19 07:08:53 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 1,362 ms / 5,000 ms |
コード長 | 3,819 bytes |
コンパイル時間 | 4,090 ms |
コンパイル使用メモリ | 80,072 KB |
実行使用メモリ | 84,196 KB |
平均クエリ数 | 236.59 |
最終ジャッジ日時 | 2024-07-16 22:07:32 |
合計ジャッジ時間 | 21,440 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 293 ms
69,340 KB |
testcase_01 | AC | 380 ms
74,000 KB |
testcase_02 | AC | 584 ms
77,240 KB |
testcase_03 | AC | 534 ms
77,352 KB |
testcase_04 | AC | 585 ms
76,988 KB |
testcase_05 | AC | 608 ms
77,140 KB |
testcase_06 | AC | 942 ms
80,580 KB |
testcase_07 | AC | 781 ms
78,900 KB |
testcase_08 | AC | 711 ms
79,420 KB |
testcase_09 | AC | 1,262 ms
83,056 KB |
testcase_10 | AC | 1,064 ms
81,752 KB |
testcase_11 | AC | 772 ms
79,216 KB |
testcase_12 | AC | 971 ms
79,896 KB |
testcase_13 | AC | 763 ms
79,904 KB |
testcase_14 | AC | 1,180 ms
81,996 KB |
testcase_15 | AC | 1,068 ms
83,472 KB |
testcase_16 | AC | 1,362 ms
84,196 KB |
ソースコード
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();//Line().trim(); if(z.charAt(0) == 'M')return -1; if(z.charAt(0) >= '0' && z.charAt(0) <= '9')return Integer.parseInt(z); throw new RuntimeException(); } 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)); } }