Cod sursa(job #3259537)

Utilizator GabrielPopescu21Silitra Gabriel - Ilie GabrielPopescu21 Data 26 noiembrie 2024 18:45:39
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.18 kb
#include <bits/stdc++.h>
using namespace std;

#define cin fin
#define cout fout

ifstream fin("cartite.in");
ofstream fout("cartite.out");

const int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
int a[205][205], b[205][205], visited[205], ind[205], ans[205], x[205], y[205], len, n, m;
vector<int> graph[205];

struct Edge {
    int xs, ys, xf, yf;
} edge[205];

bool inside(int x1, int y1)
{
    return x1 >= 1 && x1 <= n && y1 >= 1 && y1 <= m;
}

void bfs(int xs, int ys)
{
    queue<pair<int,int>> q;
    q.push({xs, ys});
    b[xs][ys] = 1;

    while (!q.empty())
    {
        int i, j;
        tie(i, j) = q.front();
        q.pop();

        if (a[i][j] == 1)
        {
            cout << i << " " << j << " " << b[i][j]-1;
            return;
        }

        for (int k = 0; k < 4; ++k)
        {
            int x = i + dx[k];
            int y = j + dy[k];
            if (inside(x, y) && a[x][y] != -1 && !b[x][y])
            {
                b[x][y] = b[i][j] + 1;
                q.push({x, y});
            }
        }
    }
}

void euler(int node)
{
    while (ind[node] < graph[node].size())
    {
        int next = graph[node][ind[node]];
        ++ind[node];

        if (!visited[next])
        {
            visited[next] = 1;
            euler(x[next] + y[next] - node);
        }
    }

    ans[++len] = node;
}

int main()
{
    int c, xs, ys, q;
    cin >> c >> n >> m >> xs >> ys >> q;

    while (q--)
    {
        int x, y, g;
        cin >> x >> y >> g;
        a[x][y] = -1;
        for (int j = 1; j <= g; ++j)
        {
            for (int k = 0; k < 4; ++k)
            {
                int is = x + j * dx[k];
                int js = y + j * dy[k];
                a[is][js] = -1;
            }
        }
    }

    map<pair<int,int>, int> M;
    map<int, pair<int,int>> M2;
    cin >> q;
    for (int i = 1; i <= q; ++i)
    {
        int xs, ys, xf, yf;
        cin >> edge[i].xs >> edge[i].ys >> edge[i].xf >> edge[i].yf;

        xs = edge[i].xs;
        ys = edge[i].ys;
        xf = edge[i].xf;
        yf = edge[i].yf;

        if (a[xs][ys] != -1)
        	a[xs][ys] = 1;

        if (a[xf][yf] != -1)
            a[xf][yf] = 1;

        if (!M.count({xs, ys}))
        {
            int dim = M.size()+1;
            M[{xs, ys}] = dim;
            M2[dim] = {xs, ys};
        }

        if (!M.count({xf, yf}))
        {
            int dim = M.size()+1;
            M[{xf, yf}] = dim;
            M2[dim] = {xf, yf};
        }
    }

    if (c == 1)
        bfs(xs, ys);
    else
    {
        int val = 0;
        for (int i = 1; i <= q; ++i)
        {
            int xs, ys, xf, yf;
            xs = edge[i].xs;
            ys = edge[i].ys;
            xf = edge[i].xf;
            yf = edge[i].yf;

            int x1 = M[{xs,ys}], y1 = M[{xf,yf}];

            ++val;
            x[val] = x1, y[val] = y1;
            graph[x1].push_back(val);
            graph[y1].push_back(val);
        }

        euler(1);
        for (int i = 1; i <= len; ++i)
            cout << M2[ans[i]].first << " " << M2[ans[i]].second << "\n";
    }

    return 0;
}