結果
| 問題 |
No.331 CodeRunnerでやれ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-12-19 07:08:53 |
| 言語 | Java (openjdk 23) |
| 結果 |
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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 16 |
ソースコード
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)); }
}