結果
| 問題 |
No.157 2つの空洞
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-03-02 11:33:28 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 100 ms / 2,000 ms |
| コード長 | 3,839 bytes |
| コンパイル時間 | 3,485 ms |
| コンパイル使用メモリ | 79,888 KB |
| 実行使用メモリ | 50,940 KB |
| 最終ジャッジ日時 | 2024-06-24 01:08:22 |
| 合計ジャッジ時間 | 4,992 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 16 |
ソースコード
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.List;
public class Main {
static StringBuilder out = new StringBuilder();
static String ls = System.lineSeparator();
static final String OK = "Possible";
static final String NG = "Impossible";
static FastReader fr = new FastReader();
// static final int INF = Integer.MAX_VALUE - 300000000;
public static void main(String[] args) throws Exception, IOException {
char wall = '#';
char hole = '.';
int w = fr.nextInt();
int h = fr.nextInt();
char[][] space = new char[h][w];
for (int i = 0; i < h; i++) {
space[i] = fr.next().toCharArray();
}
List<int[]> all = new ArrayList<>();
List<int[]> one = new ArrayList<>();
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
if (space[i][j] == hole) {
int[] a = { i, j };
all.add(a);
}
one.add(all.get(0));
int i = 0;
for (;;) {
int preSize = one.size();
all.removeAll(one);
for (; i < preSize; i++) {
int[] a = one.get(i);
for (int[] b : all) {
int range = Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
if (range == 1 && !one.contains(b)) {
one.add(b);
}
}
}
if(preSize == one.size())
break;
}
all.removeAll(one);
List<int[]> two = all;
int min = Integer.MAX_VALUE;
for(int[] a : one){
for(int[] b : two){
int range = Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
if(range < min)
min = range;
}
}
System.out.println(min - 1);
}
static void printExit(String msg) {
System.out.println(msg);
System.exit(0);
}
}
class FastReader {
private InputStream in = System.in;
private byte[] buf = new byte[1024];
private int charNum;
private int charLen;
private StringBuilder sb = new StringBuilder();
public int read() {
if (charLen == -1)
throw new InputMismatchException();
if (charNum >= charLen) {
charNum = 0;
try {
charLen = in.read(buf);
} catch (IOException e) {
throw new InputMismatchException();
}
if (charLen <= 0)
return -1;
}
return buf[charNum++];
}
public String next() {
int c = read();
while (isWhitespace(c)) {
c = read();
}
sb.setLength(0);
do {
sb.appendCodePoint(c);
c = read();
} while (!isWhitespace(c));
return sb.toString();
}
public char[] nextCharArray() {
return next().toCharArray();
}
public int nextInt() {
return (int) nextLong();
}
public int[] nextIntArray(int n) {
int[] array = new int[n];
for (int i = 0; i < n; i++)
array[i] = nextInt();
return array;
}
public List<Integer> nextIntList(int n) {
Integer[] array = new Integer[n];
for (int i = 0; i < n; i++)
array[i] = nextInt();
return Arrays.asList(array);
}
public int[][] nextIntArray2D(int n, int m) {
int[][] array = new int[n][m];
for (int i = 0; i < n; i++)
array[i] = nextIntArray(m);
return array;
}
public List<int[]> nextIntsList(int n, int m) {
List<int[]> list = new ArrayList<>(n);
for (int i = 0; i < n; i++)
list.add(nextIntArray(m));
return list;
}
public long nextLong() {
int c = read();
while (isWhitespace(c)) {
c = read();
}
int sgn = 1;
if (c == '-') {
sgn = -1;
c = read();
}
long res = 0;
do {
if (c < '0' || c > '9')
throw new InputMismatchException();
res *= 10;
res += c - '0';
c = read();
} while (!isWhitespace(c));
return res * sgn;
}
public double nextDouble() {
return Double.parseDouble(next());
}
public double[] nextDoubleArray(int n) {
double[] array = new double[n];
for (int i = 0; i < n; i++)
array[i] = nextDouble();
return array;
}
public boolean isWhitespace(int c) {
return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
}
}