結果
| 問題 | No.34 砂漠の行商人 |
| コンテスト | |
| ユーザー |
myanta
|
| 提出日時 | 2017-05-04 17:05:29 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 50 ms / 5,000 ms |
| コード長 | 1,595 bytes |
| コンパイル時間 | 697 ms |
| コンパイル使用メモリ | 58,708 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-28 10:35:32 |
| 合計ジャッジ時間 | 1,762 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:114:38: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
114 | scanf("%d", &l[y][x]);
| ~~~~~^~~~~~~~~~~~~~~~
ソースコード
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
struct state_t
{
int x, y, d, v;
bool operator < (const state_t& rhs) const
{
return d>rhs.d;
}
};
using dpe_t=vector<pair<int,int> >;
int n, v, sx, sy, gx, gy;
vector<vector<int> > l;
vector<vector<dpe_t> > dp;
priority_queue<state_t> que;
void push(int x, int y, int d, int v)
{
if(v<=0) return;
que.push((state_t){x, y, d, v});
}
int pop(int& x, int& y, int& d, int& v)
{
if(que.empty()) return 0;
state_t s=que.top();
x=s.x;
y=s.y;
d=s.d;
v=s.v;
que.pop();
return 1;
}
void pop_all(void)
{
while(!que.empty()) que.pop();
}
int solve(void)
{
int vx[]={ 1, 0,-1, 0};
int vy[]={ 0,-1, 0, 1};
int x, y, d=0, r, nx, ny, i;
dp.clear();
dp.resize(n);
for(y=0;y<n;y++)
{
dp[y].resize(n);
}
pop_all();
push(sx-1, sy-1, d, v);
while(pop(x, y, d, r))
{
dpe_t& dpe=dp[y][x];
if(x==gx-1 && y==gy-1) return d;
for(i=dp[y][x].size()-1;i>=0;i--)
{
pair<int,int>& p=dpe[i];
if(d>=p.first && r<=p.second) break;
if(d<p.first && r>p.second) dpe.erase(dpe.begin()+i);
}
if(i>=0)
{
continue;
}
if(i<0)
{
dpe.push_back(make_pair(d, r));
}
for(i=0;i<4;i++)
{
nx=x+vx[i];
ny=y+vy[i];
if(nx<0 || n<=nx || ny<0 || n<=ny) continue;
push(nx, ny, d+1, r-l[ny][nx]);
}
}
return -1;
}
int main(void)
{
int x, y;
while(scanf("%d%d%d%d%d%d", &n ,&v, &sx, &sy, &gx, &gy)==6)
{
l.resize(n);
for(y=0;y<n;y++)
{
l[y].resize(n);
for(x=0;x<n;x++)
{
scanf("%d", &l[y][x]);
}
}
printf("%d\n", solve());
}
return 0;
}
myanta