結果

問題 No.20 砂漠のオアシス
ユーザー リチウムリチウム
提出日時 2014-11-16 18:15:34
言語 Java21
(openjdk 21)
結果
WA  
実行時間 -
コード長 2,148 bytes
コンパイル時間 2,534 ms
コンパイル使用メモリ 80,456 KB
実行使用メモリ 67,472 KB
最終ジャッジ日時 2024-10-13 04:58:46
合計ジャッジ時間 10,067 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 136 ms
53,744 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 AC 223 ms
56,652 KB
testcase_05 AC 516 ms
65,664 KB
testcase_06 AC 571 ms
67,264 KB
testcase_07 AC 576 ms
67,332 KB
testcase_08 AC 582 ms
67,292 KB
testcase_09 WA -
testcase_10 WA -
testcase_11 AC 137 ms
54,184 KB
testcase_12 WA -
testcase_13 WA -
testcase_14 AC 237 ms
57,544 KB
testcase_15 AC 229 ms
57,504 KB
testcase_16 AC 282 ms
58,468 KB
testcase_17 WA -
testcase_18 AC 272 ms
58,764 KB
testcase_19 WA -
testcase_20 AC 203 ms
56,640 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.util.*;

public class Main {
	public static int[] dijstra(ArrayList<Integer> e[], ArrayList<Integer> c[],
			int start) {
		PriorityQueue<Edge> dij = new PriorityQueue<>();
		int ans[] = new int[e.length];
		boolean ok[] = new boolean[e.length];
		Arrays.fill(ans, Integer.MAX_VALUE);
		ans[start] = 0;
		ok[start] = true;
		dij.add(new Edge(start, 0));
		while (!dij.isEmpty()) {
			Edge ed = dij.poll();
			if (ans[ed.p] < ed.c)
				continue;
			int a = ed.p;
			ok[a] = true;
			for (int i = 0; i < e[a].size(); i++) {
				int x = e[a].get(i);
				int y = c[a].get(i);
				if (!ok[x] && ans[x] > ans[a] + y) {
					ans[x] = ans[a] + y;
					dij.add(new Edge(x, ans[x]));
				}
			}
		}
		return ans;
	}

	
				
	public static void main(String[] args) {
		Scanner sc=new Scanner (System.in);
		int n=sc.nextInt();
		int hp=sc.nextInt();
		int map[][]=new int[n][n];
		int ox=sc.nextInt()-1;
		int oy=sc.nextInt()-1;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				map[i][j]=sc.nextInt();
			}
		}
		ArrayList <Integer>e[]=new ArrayList[n*n];
		ArrayList <Integer>c[]=new ArrayList[n*n];
		for(int i=0;i<n*n;i++){
			e[i]=new ArrayList<>();
			c[i]=new ArrayList<>();
		}
		
		for(int i=0;i<n*n;i++){
			int x=i/n;
			int y=i-x*n;
			int dx[]={1,-1,0,0};
			int dy[]={0,0,1,-1};
			for(int j=0;j<4;j++){
				int nx=x+dx[j];
				int ny=y+dy[j];
				if(nx<0 || nx>=n || ny<0 || ny>=n)continue;
					e[i].add(nx*n+ny);
					c[i].add(map[nx][ny]);
				
			}
		}
		
		int dij[]=dijstra(e,c,0);
		int g=(n-1)*(n-1);
		if(dij[g]<hp){
			System.out.println("YES");
			return;
		}
		if(ox!=-1){
			int oa=ox*n+oy;
			dij=dijstra(e,c,0);
			hp-=dij[oa];
			hp*=2;
			dij=dijstra(e,c,oa);
			if(hp>dij[g]){
				System.out.println("YES");
				return;
			}
		}
		System.out.println("NO");
	}
	
	
	}

class Edge implements Comparable<Edge> {//scacheさんから拝借
	int p;
	int c;

	public Edge(int p, int c) {
		this.p = p;
		this.c = c;
	}

	public Edge() {
	}

	@Override
	public int compareTo(Edge o) {
		return this.c - o.c;
	}

}
0