Cod sursa(job #2491284)

Utilizator razviii237Uzum Razvan razviii237 Data 12 noiembrie 2019 10:56:51
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

ifstream f("zona.in");
ofstream g("zona.out");

const int maxn = 2555;
int x, y, n, m, i, xa, xb, fx, fy;
int v[maxn];
int a[55][55];

int v1[] = {0, -1, 0, 1, 0};
int v2[] = {0, 0, 1, 0, -1};

struct xy { int x, y; };

queue <xy> q;

void bfs(xy start) {
    int x, y, xx, yy;
    q.push(start);
    while(!q.empty()) {
        x = q.front().x;
        y = q.front().y;
        q.pop();
        for(i = 1; i <= 4; i ++) {
            xx = x + v1[x];
            yy = y + v2[y];
            if(b[xx][yy])
            if(xx >= 1 && xx <= n && yy >= 1 && yy <= n) {
                if((a[x][y] & (1 << i)) != 0) {
                    b[xx][yy] = 1;
                    q.push({xx, yy});
                }
            }
        }

    }
}

int main()
{
    f >> x >> y >> n >> m;
    for(i = 1; i <= m; i ++) {
        f >> v[i];
    }
    // -----------------1--------------------------
    xa = x; xb = y;
    for(i = 1; i <= m; i ++) {
        xa += v1[v[i] ];
        xb += v2[v[i] ];
    }
    fx = xa; fy = xb;
    xa = x; xb = y;
    for(i = 1; i <= m; i ++) {
        xa += v1[v[i] ];
        xb += v2[v[i] ];
        if(xa == fx && xb == fy) {
            g << m - i << '\n';
            break;
        }
    }
    // ------------------2-------------------------

    xa = x; xb = y;
    for(i = 1; i <= m; i ++) {
        xa += v1[v[i] ];
        xb += v2[v[i] ];
        if(v[i] == 2) {
            a[xa][xb] |= (1 << 3);
            a[xa+1][xb] |= (1 << 1);
        } else if(v[i] == 4) {
            a[xa][xb+1] |= (1 << 3);
            a[xa+1][xb+1] |= (1 << 1);
        } else if(v[i] == 3) {
            a[xa][xb] |= (1 << 2);
            a[xa][xb+1] |= (1 << 4);
        } else if(v[i] == 3) {
            a[xa+1][xb] |= (1 << 2);
            a[xa+1][xb+1] |= (1 << 4);
        }
    }
    bfs({1, 1});

    f.close(); g.close();
    return 0;
}