結果
| 問題 |
No.20 砂漠のオアシス
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-04-28 19:03:47 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 477 ms / 5,000 ms |
| コード長 | 2,339 bytes |
| コンパイル時間 | 3,402 ms |
| コンパイル使用メモリ | 78,380 KB |
| 実行使用メモリ | 49,404 KB |
| 最終ジャッジ日時 | 2024-10-13 05:07:54 |
| 合計ジャッジ時間 | 9,434 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
/**
* yukicoder no.20
* @author scache
*
*/
public class OasisInDesert {
public static void main(String[] args) {
OasisInDesert p = new OasisInDesert();
}
public OasisInDesert() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int v = sc.nextInt();
int oy = sc.nextInt()-1;
int ox = sc.nextInt()-1;
Point[][] map = new Point[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
map[i][j] = new Point(i,j,sc.nextInt());
}
}
// long s = System.currentTimeMillis();
solve(v, ox, oy, map);
// long e= System.currentTimeMillis();
// System.out.println((e-s)/1000.0 + "s");
}
public void solve(int v, int ox, int oy, Point[][] map) {
int distance = dijstra(map, 0, 0, map.length-1, map.length-1);
if(v>distance){
System.out.println("YES");
return;
}
if(ox<0 && oy<0){
System.out.println("NO");
return;
}
int oDistance = dijstra(map, 0, 0, ox, oy);
int gDistance = dijstra(map, ox, oy, map.length-1, map.length-1);
if( (v-oDistance)*2>gDistance){
System.out.println("YES");
return;
}
System.out.println("NO");
}
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, -1, 0, 1};
private int dijstra(Point[][] map, int sx, int sy, int tx, int ty){
PriorityQueue<Point> queue = new PriorityQueue<Point>();
int[][] distances = new int[map.length][map.length];
for(int i=0;i<distances.length;i++)
Arrays.fill(distances[i], Integer.MAX_VALUE);
distances[sx][sy] = 0;
queue.offer(new Point(sx, sy, 0));
while(!queue.isEmpty()){
Point p = queue.poll();
if(distances[p.x][p.y]<p.d)
continue;
for(int i=0;i<4;i++){
int nx = p.x+dx[i];
int ny = p.y+dy[i];
if(0<=nx && nx<map.length && 0<=ny && ny<map.length){
if(distances[nx][ny] > distances[p.x][p.y] + map[nx][ny].d){
distances[nx][ny] = distances[p.x][p.y] + map[nx][ny].d;
queue.offer(new Point(nx, ny, distances[nx][ny]));
}
}
}
}
return distances[tx][ty];
}
private class Point implements Comparable<Point>{
public int x;
public int y;
public int d;
public Point(int x, int y, int d){
this.x = x;
this.y = y;
this.d = d;
}
@Override
public int compareTo(Point arg0) {
return d-arg0.d;
}
}
}