結果

問題 No.331 CodeRunnerでやれ
ユーザー uwiuwi
提出日時 2015-12-19 22:50:40
言語 Java21
(openjdk 21)
結果
AC  
実行時間 1,164 ms / 5,000 ms
コード長 4,455 bytes
コンパイル時間 3,868 ms
コンパイル使用メモリ 76,300 KB
実行使用メモリ 79,704 KB
平均クエリ数 236.59
最終ジャッジ日時 2023-09-23 22:30:42
合計ジャッジ時間 18,011 ms
ジャッジサーバーID
(参考情報)
judge15 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 261 ms
72,404 KB
testcase_01 AC 321 ms
74,836 KB
testcase_02 AC 440 ms
75,740 KB
testcase_03 AC 405 ms
77,792 KB
testcase_04 AC 467 ms
76,080 KB
testcase_05 AC 452 ms
75,008 KB
testcase_06 AC 842 ms
79,704 KB
testcase_07 AC 694 ms
77,868 KB
testcase_08 AC 541 ms
76,160 KB
testcase_09 AC 1,020 ms
79,100 KB
testcase_10 AC 854 ms
76,732 KB
testcase_11 AC 579 ms
77,468 KB
testcase_12 AC 672 ms
75,852 KB
testcase_13 AC 734 ms
76,136 KB
testcase_14 AC 1,164 ms
77,768 KB
testcase_15 AC 877 ms
77,592 KB
testcase_16 AC 1,149 ms
78,496 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 = 65, m = 65;
	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){
//			System.err.printf("when:%s, r:%d c:%d dir:%d\n", LocalDateTime.now(), r, c, dir);
			int dist = read();
			if(dist == -1){
//				System.err.printf("when:%s, DIST=-1\n", LocalDateTime.now());
				return;
			}
			if(dist == 20151224){
//				System.err.printf("when:%s, DIST=X\n", LocalDateTime.now());
				// found the goal
				while(dist != -1){
//					System.err.printf("when:%s, WHILE", LocalDateTime.now());
					out.println("F"); out.flush();
					dist = read();
					if(dist == -1){
//						System.err.printf("when:%s, DIST=-1\n", LocalDateTime.now());
						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]] = '#';
			
			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;
			}
//			System.err.printf("when:%s, closeest=%s\n", LocalDateTime.now(), Arrays.toString(closest));
			out.println("FBLR".charAt(closest[2]-1));
			out.flush();
		}
	}
	
	static int read()
	{
		String z = in.next();//Line().trim();
//		System.err.printf("when:%s, z:%d:%s\n", LocalDateTime.now(), z.length(), z);
		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