# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
410792 | snasibov05 | Clickbait (COCI18_clickbait) | C++14 | 31 ms | 6220 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
#define pb push_back
struct point{
int x, y;
point(){}
point(int xx, int yy){
x = xx;
y = yy;
}
};
struct container{
int idx;
point tl;
point br;
container(int i, int x1, int y1, int x2, int y2){
idx = i;
tl = point(x1, y1);
br = point(x2, y2);
}
};
bool isdigit(char c){
return c >= '0' && c <= '9';
}
vector<vector<int>> ed;
vector<int> order;
vector<bool> visited;
void dfs(int cur){
visited[cur] = true;
for (auto x : ed[cur]){
if (!visited[x]) dfs(x);
}
order.pb(cur);
}
int main() {
int n, m; cin >> n >> m;
vector<string> grid(n);
for (int i = 0; i < n; ++i){
cin >> grid[i];
}
int v = 0;
vector<container> a;
vector<vector<int>> id(n, vector<int>(m, -1));
// - Find containers
// - Define them by indices, coordinates of top left and bottom right
// - Define id's of borders of containers by the corresponding index
for (int i = 0; i < n; ++i){
for (int j = 0; j < m; ++j){
if (isdigit(grid[i][j])){
int k = 0;
while (isdigit(grid[i][j])) k = (k * 10) + grid[i][j++] - '0';
j--;
int x1 = i;
while (grid[x1][j] != '-') x1--;
int x2 = i;
while (grid[x2][j] != '-') x2++;
int y1 = j;
while (grid[i][y1] != '|') y1--;
int y2 = j;
while (grid[i][y2] != '|') y2++;
v = max(v, k);
a.pb(container(k, x1, y1, x2, y2));
for (int l = x1; l <= x2; ++l){
id[l][y1] = id[l][y2] = k;
}
for (int l = y1; l <= y2; ++l){
id[x1][l] = id[x2][l] = k;
}
}
}
}
ed.resize(v+1);
visited.resize(v+1);
// - Follow the pathes coming from each container from bottom to top and add edges accordingly
// - Directions ( 0 -> up, 1 -> down, 2 -> left, 3 -> right
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
for (container c : a){
for (int j = c.br.x; j >= c.tl.x; --j){
if (c.tl.y > 0 && grid[j][c.tl.y-1] == '-'){
int dir = 2;
point cur = point(j, c.tl.y);
cur.x += dx[dir];
cur.y += dy[dir];
if (grid[cur.x][cur.y] == '+' && dir > 1) dir = 1;
else if (grid[cur.x][cur.y] == '+' && cur.y > 0 && grid[cur.x][cur.y-1] == '-') dir = 2;
else if (grid[cur.x][cur.y] == '+') dir = 3;
while (id[cur.x][cur.y] == -1){
cur.x += dx[dir];
cur.y += dy[dir];
if (grid[cur.x][cur.y] == '+' && dir > 1) dir = 1;
else if (grid[cur.x][cur.y] == '+' && cur.y > 0 && grid[cur.x][cur.y-1] == '-') dir = 2;
else if (grid[cur.x][cur.y] == '+') dir = 3;
}
ed[c.idx].pb(id[cur.x][cur.y]);
}
if (c.br.y < m && grid[j][c.br.y+1] == '-') {
cerr << "\n";
int dir = 3;
point cur = point(j, c.br.y);
cur.x += dx[dir];
cur.y += dy[dir];
if (grid[cur.x][cur.y] == '+' && dir > 1) dir = 1;
else if (grid[cur.x][cur.y] == '+' && cur.y > 0 && grid[cur.x][cur.y-1] == '-') dir = 2;
else if (grid[cur.x][cur.y] == '+') dir = 3;
//cerr << cur.x << " " << cur.y << " " << grid[cur.x][cur.y] << " " << id[cur.x][cur.y] << "\n";
while (id[cur.x][cur.y] == -1){
cur.x += dx[dir];
cur.y += dy[dir];
if (grid[cur.x][cur.y] == '+' && dir > 1) dir = 1;
else if (grid[cur.x][cur.y] == '+' && cur.y > 0 && grid[cur.x][cur.y-1] == '-') dir = 2;
else if (grid[cur.x][cur.y] == '+') dir = 3;
//cerr << cur.x << " " << cur.y << " " << grid[cur.x][cur.y] << " " << id[cur.x][cur.y] << "\n";
}
ed[c.idx].pb(id[cur.x][cur.y]);
}
}
}
dfs(1);
for (auto x : order) cout << x << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |