結果

問題 No.157 2つの空洞
ユーザー jp_stejp_ste
提出日時 2015-03-17 11:19:06
言語 Java21
(openjdk 21)
結果
AC  
実行時間 150 ms / 2,000 ms
コード長 2,769 bytes
コンパイル時間 2,407 ms
コンパイル使用メモリ 78,520 KB
実行使用メモリ 45,276 KB
最終ジャッジ日時 2024-06-28 23:07:21
合計ジャッジ時間 5,979 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 130 ms
41,336 KB
testcase_01 AC 132 ms
41,228 KB
testcase_02 AC 135 ms
41,364 KB
testcase_03 AC 132 ms
41,216 KB
testcase_04 AC 136 ms
41,380 KB
testcase_05 AC 136 ms
41,620 KB
testcase_06 AC 136 ms
41,560 KB
testcase_07 AC 134 ms
41,840 KB
testcase_08 AC 137 ms
41,440 KB
testcase_09 AC 124 ms
40,424 KB
testcase_10 AC 133 ms
41,444 KB
testcase_11 AC 136 ms
41,820 KB
testcase_12 AC 144 ms
44,128 KB
testcase_13 AC 141 ms
43,248 KB
testcase_14 AC 136 ms
41,468 KB
testcase_15 AC 142 ms
42,652 KB
testcase_16 AC 140 ms
43,584 KB
testcase_17 AC 141 ms
41,768 KB
testcase_18 AC 150 ms
45,276 KB
testcase_19 AC 149 ms
43,584 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	
	static int W, H;
	static char C[][];
	static int DP[][];
	static int mAns = Integer.MAX_VALUE;
	
	public static void main(String[] args) {
		readMap();
		
		boolean find = false;
		for(int i=0; i<H; i++) {
			for(int j=0; j<W; j++) {
				if(C[i][j] == '.') {
					replaceCavity(j, i, '+');
					find=true;
					break;
				}
			}
			if(find) break;
		}
		
		for(int i=0; i<H; i++) {
			for(int j=0; j<W; j++) {
				if(C[i][j] == '.') {
					solve(j, i);
				}
			}
		}
		System.out.println(mAns-1);
	}
		
	static void solve(int startX, int startY) {
		
		Queue<Node> q = new LinkedList<Node>();
		
		Node start = new Node(startX, startY, 0, C);
		q.add(start);
		
		while(!q.isEmpty()) {
			
			Node node = q.poll();
						
			if(DP[node.mY][node.mX] <= node.mStep) continue;
			DP[node.mY][node.mX] = node.mStep;
			
			if(mAns <= node.mStep) continue;
			if(node.mX == 0 || node.mX == W-1) continue;
			if(node.mY == 0 || node.mY == H-1) continue;
			
			if(node.mMap[node.mY][node.mX] == '+') {
				mAns = Math.min(mAns, node.mStep);
				continue;
			}
			
			node.mMap[node.mY][node.mX] = '.';
			
			int nextStep = node.mStep+1;
			int nextX, nextY;
			char nextMap[][] = node.mMap;
			
			//上
			nextX = node.mX;
			nextY = node.mY-1;
			if(node.mMap[nextY][nextX] != '.') {
				Node next = new Node(nextX, nextY, nextStep, nextMap);
				q.add(next);
			}
			//右
			nextX = node.mX+1;
			nextY = node.mY;
			if(node.mMap[nextY][nextX] != '.') {
				Node next = new Node(nextX, nextY, nextStep, nextMap);
				q.add(next);
			}
			//下
			nextX = node.mX;
			nextY = node.mY+1;
			if(node.mMap[nextY][nextX] != '.') {
				Node next = new Node(nextX, nextY, nextStep, nextMap);
				q.add(next);
			}
			//左
			nextX = node.mX-1;
			nextY = node.mY;
			if(node.mMap[nextY][nextX] != '.') {
				Node next = new Node(nextX, nextY, nextStep, nextMap);
				q.add(next);
			}
		}
	}
	
	
	static void readMap() {
		Scanner sc = new Scanner(System.in);
		W = sc.nextInt();
		H = sc.nextInt();
		C = new char[H][W];
		DP = new int[H][W];
		
		for(int i=0; i<H; i++) {
			String line = sc.next();
			for(int j=0; j<W; j++) {
				C[i][j] = line.charAt(j);
				DP[i][j] = Integer.MAX_VALUE;
			}
		}
	}
	
	static void replaceCavity(int j, int i, char v) {
		
		if(C[i][j] != '.') return;
		C[i][j] = v;
		
		replaceCavity(j+1, i  , v);
		replaceCavity(j  , i+1, v);
		replaceCavity(j-1, i  , v);
		replaceCavity(j  , i-1, v);
	}	
}

class Node {
	int mX, mY, mStep;
	char mMap[][];
	
	Node(int x, int y, int step, char[][] map) {
		mX = x; mY = y; mStep = step;
		mMap = new char[Main.H][Main.W];
		
		for(int i=0; i<Main.H; i++) {
			mMap[i] = map[i].clone();
		}
	}
}
0