結果

問題 No.34 砂漠の行商人
ユーザー fumiphysfumiphys
提出日時 2019-04-07 01:25:05
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 353 ms / 5,000 ms
コード長 2,695 bytes
コンパイル時間 1,103 ms
コンパイル使用メモリ 113,756 KB
実行使用メモリ 395,304 KB
最終ジャッジ日時 2023-09-07 18:42:59
合計ジャッジ時間 4,393 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
7,588 KB
testcase_01 AC 3 ms
11,756 KB
testcase_02 AC 15 ms
58,952 KB
testcase_03 AC 13 ms
58,892 KB
testcase_04 AC 11 ms
14,776 KB
testcase_05 AC 25 ms
72,232 KB
testcase_06 AC 17 ms
64,344 KB
testcase_07 AC 30 ms
77,108 KB
testcase_08 AC 36 ms
85,236 KB
testcase_09 AC 196 ms
244,092 KB
testcase_10 AC 353 ms
395,064 KB
testcase_11 AC 193 ms
395,304 KB
testcase_12 AC 42 ms
202,484 KB
testcase_13 AC 101 ms
279,660 KB
testcase_14 AC 95 ms
274,396 KB
testcase_15 AC 48 ms
215,436 KB
testcase_16 AC 52 ms
207,828 KB
testcase_17 AC 58 ms
235,480 KB
testcase_18 AC 17 ms
75,720 KB
testcase_19 AC 67 ms
243,924 KB
testcase_20 AC 77 ms
251,976 KB
testcase_21 AC 61 ms
238,784 KB
testcase_22 AC 70 ms
248,132 KB
testcase_23 AC 65 ms
236,940 KB
testcase_24 AC 129 ms
320,936 KB
testcase_25 AC 53 ms
229,056 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// includes
#include <cassert>
#include <cstdio>
#include <cstdint>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <algorithm>
#include <utility>
#include <functional>
#include <cmath>
#include <climits>
#include <bitset>
#include <list>
#include <random>

// macros
#define ll long long int
#define pb emplace_back
#define mk make_pair
#define pq priority_queue
#define FOR(i, a, b) for(int i=(a);i<(b);++i)
#define rep(i, n) FOR(i, 0, n)
#define rrep(i, n) for(int i=((int)(n)-1);i>=0;i--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end())

using namespace std;

//  types
typedef pair<int, int> P;
typedef pair<ll, int> Pl;
typedef pair<ll, ll> Pll;
typedef pair<double, double> Pd;
 
// constants
const int inf = 1e9;
const ll linf = 1LL << 50;
const double EPS = 1e-10;
const int mod = 1e9 + 7;

// solve
template <class T>bool chmax(T &a, const T &b){if(a < b){a = b; return 1;} return 0;}
template <class T>bool chmin(T &a, const T &b){if(a > b){a = b; return 1;} return 0;}

int l[101][101];
int n, V, sx, sy, gx, gy;

struct point{
  int i, j, v;
  point(){}
  point(int i, int j, int v): i(i), j(j), v(v){}
};

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};

int dis[101][101][10001];
int maxi[101][101];

int main(int argc, char const* argv[])
{
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> V >> sx >> sy >> gx >> gy, sx--, sy--, gx--, gy--;
  rep(i, n){
    rep(j, n)cin >> l[i][j];
  }
  swap(sx, sy);
  swap(gx, gy);
  rep(i, n){
    rep(j, n){
      rep(k, V+1){
        dis[i][j][k] = inf;
      }
    }
  }
  dis[sx][sy][V] = 0;
  queue<point> q;
  q.push(point(sx, sy, V));
  while(!q.empty()){
    point p = q.front(); q.pop();
    //cerr << p.i << " " << p.j << " " << p.v << endl;
    if(maxi[p.i][p.j] > p.v)continue;
    maxi[p.i][p.j] = p.v;
    if(p.i == gx && p.j == gy)break;
    rep(k, 4){
      int nx = p.i + dx[k];
      int ny = p.j + dy[k];
      //cerr << nx << " " << ny << endl;
      if(nx >= 0 && nx < n && ny >= 0 && ny < n){
        if(p.v > l[nx][ny] && maxi[nx][ny] < p.v - l[nx][ny]){
          maxi[nx][ny] = p.v - l[nx][ny];
          dis[nx][ny][p.v - l[nx][ny]] = dis[p.i][p.j][p.v] + 1;
          q.push(point(nx, ny, p.v - l[nx][ny]));
        }
      }
    }
  }
//   rep(i, n){
//     rep(j, n)cout << maxi[i][j] << "\n "[j + 1 != n];
//   }
  int res = inf;
  rep(i, V+1){
    res = min(res, dis[gx][gy][i]);
  }
  if(res != inf)cout << res << endl;
  else cout << -1 << endl;
	return 0;
}
0