結果
| 問題 |
No.1638 Robot Maze
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-08-06 23:10:08 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 4 ms / 2,000 ms |
| コード長 | 1,899 bytes |
| コンパイル時間 | 1,882 ms |
| コンパイル使用メモリ | 181,516 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-17 03:25:58 |
| 合計ジャッジ時間 | 3,286 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 49 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for (int i = 0; i < (n); ++i)
template<class T> inline bool chmin(T& a, T b) {if (a > b) {a = b;return true;}return false;}
template<class T> inline bool chmax(T& a, T b) {if (a < b) {a = b;return true;}return false;}
using ll = long long;
using P = pair<int,int>;
using Pl = pair<long long,long long>;
using veci = vector<int>;
using vecl = vector<long long>;
using vecveci = vector<vector<int>>;
using vecvecl = vector<vector<long long>>;
const int MOD = 1000000007;
const double pi = acos(-1);
ll gcd(ll a, ll b) {if(b == 0) return a; else return gcd(b,a%b);}
ll lcm(ll a, ll b) {return a*b/gcd(a,b);}
int dx[] = {-1,0,1,0};
int dy[] = {0,-1,0,1};
int main() {
int H,W; cin >> H >> W;
ll U,D,R,L,K,Px;
cin >> U >> D >> R >> L >> K >> Px;
int sx,sy,gx,gy;
cin >> sy >> sx >> gy >> gx;
sx--, sy--,gx--,gy--;
vecl cost = {L,U,R,D};
vector<string> S(H);
REP(i,H) cin >> S[i];
vecvecl dist(H,vecl(W,1LL<<60));
priority_queue<pair<ll,P>, vector<pair<ll,P>>, greater<pair<ll,P>>> que;
que.push({0,{sy,sx}});
dist[sy][sx] = 0;
while(que.size()) {
pair<ll,P> p = que.top();
que.pop();
ll K = p.first;
int i = p.second.first;
int j = p.second.second;
if(K > dist[i][j]) continue;
REP(dir,4) {
int ni = i + dy[dir];
int nj = j + dx[dir];
if(ni < 0 || ni >= H || nj < 0 || nj >= W) continue;
if(S[ni][nj] == '#') continue;
ll c = cost[dir];
if(S[ni][nj] == '@') c += Px;
if(dist[ni][nj] > dist[i][j] + c) {
dist[ni][nj] = dist[i][j] + c;
que.push({dist[ni][nj],{ni,nj}});
}
}
}
if(dist[gy][gx] > K) {
cout <<"No" << endl;
} else cout << "Yes" << endl;
return 0;
}