結果

問題 No.331 CodeRunnerでやれ
ユーザー uwiuwi
提出日時 2015-12-22 23:31:05
言語 Java21
(openjdk 21)
結果
AC  
実行時間 963 ms / 5,000 ms
コード長 4,012 bytes
コンパイル時間 4,103 ms
コンパイル使用メモリ 79,968 KB
実行使用メモリ 78,304 KB
平均クエリ数 236.59
最終ジャッジ日時 2024-07-16 22:15:37
合計ジャッジ時間 16,207 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 292 ms
69,648 KB
testcase_01 AC 338 ms
72,628 KB
testcase_02 AC 443 ms
76,020 KB
testcase_03 AC 402 ms
74,724 KB
testcase_04 AC 453 ms
75,448 KB
testcase_05 AC 438 ms
75,552 KB
testcase_06 AC 681 ms
77,944 KB
testcase_07 AC 589 ms
77,372 KB
testcase_08 AC 491 ms
76,704 KB
testcase_09 AC 790 ms
77,252 KB
testcase_10 AC 640 ms
77,652 KB
testcase_11 AC 532 ms
76,672 KB
testcase_12 AC 620 ms
77,232 KB
testcase_13 AC 613 ms
77,520 KB
testcase_14 AC 828 ms
77,832 KB
testcase_15 AC 803 ms
77,796 KB
testcase_16 AC 963 ms
78,304 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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 = 45, m = 45;
	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 = n/2, c = m/2;
		map[r][c] = '.';
		int dir = 0;
		
		while(true){
			int dist = read();
			if(dist == -1){
				return;
			}
			if(dist == 20151224){
				// found the goal
				// ゴールへまっしぐら
				while(dist != -1){
					out.println("F"); out.flush();
					dist = read();
					if(dist == -1){
						return;
					}
				}
				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]] = '#';
			
			// 最も近い未知のセルにL,R,Fのみで行く
			int[] closest = closestUnknown(r, c, dir, map);
			if(closest == null)throw new RuntimeException("closest not found");
			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) >= '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)); }
}
0