結果
| 問題 |
No.20 砂漠のオアシス
|
| コンテスト | |
| ユーザー |
kazuto_0215
|
| 提出日時 | 2016-05-02 18:44:04 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,758 bytes |
| コンパイル時間 | 1,556 ms |
| コンパイル使用メモリ | 165,480 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-10-13 05:36:57 |
| 合計ジャッジ時間 | 5,745 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 WA * 5 |
ソースコード
#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
typedef pair<int,int>P;
typedef pair<P,P>PP;
priority_queue<PP,vector<PP>,greater<PP> >pq;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main(){
int n,hp,ox,oy;
int mas[222][222];
int dics[222][222][2];//3つ目はオアシスを使えるかどうか
cin >> n >> hp >> ox >> oy;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin >> mas[i][j];
}
}
if(ox==0 && oy==0){
dics[0][0][0]=hp;
pq.push(PP(P(hp,0),P(0,0)));//左から体力、オアシス不可、x、y座標
}else{
dics[0][0][1]=hp;
pq.push(PP(P(hp,1),P(0,0)));//左から体力、オアシス不可、x、y座標
}
while(!pq.empty()){
PP now=pq.top();
pq.pop();
int sa=0,flag=now.F.S;
for(int i=0;i<4;i++){
int nx,ny;
nx=now.S.F + dx[i];
ny=now.S.S + dy[i];
if(nx<0 || ny<0 || nx>=n || ny>=n)continue;
if(dics[now.S.S][now.S.F][flag] - mas[ny][nx] > 0){//体力が尽きずに移動できたら
sa=dics[now.S.S][now.S.F][flag] - mas[ny][nx];
}else continue;
/*ダイクストラの要領*/
if(dics[ny][nx][flag] < sa){//移動前後でそこの場所への最小ルートが変化しそうだったら
dics[ny][nx][flag] = sa;
pq.push(PP(P(sa,flag),P(nx,ny)));
}
/*オアシスに行く権利があり、その場所の体力最小数が今現在の体力を2倍したものより小さい*/
if(nx==ox && ny==oy && flag==1 && dics[ny][nx][1] < (2*sa)){
dics[ny][nx][0]=sa*2;
pq.push(PP(P(2*sa,0),P(nx,ny)));
}
}
}
if(dics[n-1][n-1][0]>0 || dics[n-1][n-1][1]>0){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
kazuto_0215