Submission #36669200
Source Code Expand
#include <bits/stdc++.h>
typedef long long ll;
const int INF = 1e9;
const int MOD = 1e9+7;
const ll LINF = 1e18;
using namespace std;
int H, W;
vector<string> graph;
struct UnionFind {
vector<int> par; // par[i]:iの親の番号 (例) par[3] = 2 : 3の親が2
UnionFind(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の根をrx
int ry = root(y); //yの根をry
if (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 >> H >> W;
pair<int, int> start;
UnionFind join(H * W + 10);
graph = vector<string>(H);
for (int i = 0; i < H; i++) {
cin >> graph[i];
for (int j = 0; j < W; j++) {
if (graph[i][j] == 'S')start = make_pair(i, j);
}
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W-1; j++) {
if (graph[i][j] == '.' && graph[i][j+1] == '.') {
join.unite(i * W + j, i * W + j+1);
}
}
}
for (int i = 0; i < H - 1; i++) {
for (int j = 0; j < W ; j++) {
if (graph[i][j] == '.' && graph[i + 1][j] == '.') {
join.unite(i * W + j, (i + 1) * W + j);
}
}
}
int origin,north, east, west, south;
origin = start.first * W + start.second;
north = (start.first-1) * W + start.second;
south = (start.first+1) * W + start.second;
east = start.first * W + start.second + 1;
west = start.first * W + start.second - 1;
if (start.first==0)north = H*W+2;
if (start.first == H)south = H * W + 3;
if (start.second == 0)west = H * W + 4;
if (start.second == W)east = H * W + 5;
if (join.same(north,east)||
join.same(north,west)||
join.same(north,south)||
join.same(west,east)||
join.same(west,south)||
join.same(east,south)
){
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
return 0;
}
Submission Info
Submission Time
2022-11-20 20:57:15+0900
Task
E - Round Trip
User
amaoto
Language
C++ (GCC 9.2.1)
Score
500
Code Size
2728 Byte
Status
AC
Exec Time
54 ms
Memory
23988 KiB
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:65:9: warning: variable ‘origin’ set but not used [-Wunused-but-set-variable]
65 | int origin,north, east, west, south;
| ^~~~~~
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
500 / 500
Status
Set Name
Test Cases
Sample
example_00.txt, example_01.txt, example_02.txt
All
example_00.txt, example_01.txt, example_02.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt
Case Name
Status
Exec Time
Memory
example_00.txt
AC
12 ms
3400 KiB
example_01.txt
AC
2 ms
3544 KiB
example_02.txt
AC
2 ms
3372 KiB
test_00.txt
AC
46 ms
8324 KiB
test_01.txt
AC
43 ms
8880 KiB
test_02.txt
AC
45 ms
8792 KiB
test_03.txt
AC
43 ms
8120 KiB
test_04.txt
AC
47 ms
8588 KiB
test_05.txt
AC
43 ms
8088 KiB
test_06.txt
AC
45 ms
8660 KiB
test_07.txt
AC
47 ms
8728 KiB
test_08.txt
AC
2 ms
3412 KiB
test_09.txt
AC
2 ms
3524 KiB
test_10.txt
AC
2 ms
3420 KiB
test_11.txt
AC
54 ms
23988 KiB
test_12.txt
AC
35 ms
8664 KiB
test_13.txt
AC
27 ms
8852 KiB
test_14.txt
AC
26 ms
6628 KiB
test_15.txt
AC
15 ms
5220 KiB
test_16.txt
AC
19 ms
5684 KiB
test_17.txt
AC
27 ms
7600 KiB
test_18.txt
AC
22 ms
6012 KiB
test_19.txt
AC
14 ms
5460 KiB
test_20.txt
AC
20 ms
6540 KiB
test_21.txt
AC
22 ms
7032 KiB