結果
問題 | No.424 立体迷路 |
ユーザー |
![]() |
提出日時 | 2019-12-08 15:02:47 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 3,969 bytes |
コンパイル時間 | 1,525 ms |
コンパイル使用メモリ | 104,504 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-12-30 12:13:24 |
合計ジャッジ時間 | 2,740 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 21 |
ソースコード
/*Author:zekepass System Test!GET AC!!*/#include <iostream>#include <queue>#include <vector>#include <iostream>#include <vector>#include <string>#include <cassert>#include <algorithm>#include <functional>#include <cmath>#include <queue>#include <set>#include <stack>#include <deque>#include <map>#include <iomanip>#include <utility>#include <stack>#include <bitset>using ll = long long;using ld = long double;using namespace std;#define rep(i, n) for (int i = 0; i < (int)(n); i++)#define all(x) (x).begin(), (x).end()#define rep3(var, min, max) for (ll(var) = (min); (var) < (max); ++(var))#define repi3(var, min, max) for (ll(var) = (max)-1; (var) + 1 > (min); --(var))#define Mp(a, b) make_pair((a), (b))#define F first#define S second#define Icin(s) \ll(s); \cin >> (s);#define Scin(s) \ll(s); \cin >> (s);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 (b < a){a = b;return 1;}return 0;}typedef pair<ll, ll> P;typedef vector<ll> V;typedef vector<V> VV;typedef vector<P> VP;ll mod = 1e9 + 7;ll MOD = 1e9 + 7;ll INF = 1e18;struct UnionFind{vector<int> par; // par[i]:iの親の番号 (例) par[3] = 2 : 3の親が2UnionFind(int N) : par(N){ //最初は全てが根であるとして初期化for (int i = 0; i < N; i++)par[i] = i;}int root(int x){ // データxが属する木の根を再帰で得る:root(x) = {xの木の根}if (par[x] == x)return x;return par[x] = root(par[x]);}void unite(int x, int y){ // xとyの木を併合int rx = root(x); //xの根をrxint ry = root(y); //yの根をryif (rx == ry)return; //xとyの根が同じ(=同じ木にある)時はそのままpar[rx] = ry; //xとyの根が同じでない(=同じ木にない)時:xの根rxをyの根ryにつける}bool same(int x, int y){ // 2つのデータx, yが属する木が同じならtrueを返すint rx = root(x);int ry = root(y);return rx == ry;}};int main(){cin.tie(0);ios::sync_with_stdio(false);ll h, w;cin >> h >> w;ll sx, sy, gx, gy;cin >> sx >> sy >> gx >> gy;sx--;sy--;gx--;gy--;UnionFind tree(h * w);ll S = sx * w + sy;ll G = gx * w + gy;VV vec(h, V(w));rep(i, h){string s;cin >> s;rep(j, w){vec[i][j] = s[j] - '0';}}int dx[] = {1, 0, -1, 0};int dy[] = {0, 1, 0, -1};int dx2[] = {2, 0, -2, 0};int dy2[] = {0, 2, 0, -2};rep(i, h){rep(j, w){rep(k, 4){if (i + dy[k] < h && i + dy[k] >= 0 && j + dx[k] < w && j + dx[k] >= 0){if (abs(vec[i + dy[k]][j + dx[k]] - vec[i][j]) <= 1){tree.unite(i * w + j, (i + dy[k]) * w + (j + dx[k]));}}}rep(k, 4){if (i + dy2[k] < h && i + dy2[k] >= 0 && j + dx2[k] < w && j + dx2[k] >= 0){if (vec[i + dy2[k]][j + dx2[k]]==vec[i][j]&&vec[i+dy2[k]][j+dx2[k]]>vec[i+dy[k]][j+dx[k]]){tree.unite(i * w + j, (i + dy2[k]) * w + (j + dx2[k]));}}}}}/* rep(i,h){rep(j,w){cout << tree.root(i * w + j) << " ";}cout << endl;}*/// cout<<tree.root(G)<<endl;if (tree.same(S, G))cout << "YES" << endl;else{cout << "NO" << endl;}}