Cod sursa(job #2356278)

Utilizator KemyKoTeo Virghi KemyKo Data 26 februarie 2019 16:35:42
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.01 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stdlib.h>     //exit(0)
#define NMAX 201

using namespace std;

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

struct nod
{
    pair<int, int> coord;
    int index;
}M[NMAX];

queue< pair < int ,int > >Q;
vector <int> v[NMAX];
int n, m, X, Y, k, G;
int a[NMAX][NMAX];
int dx[12] = {-1,0,1, 0,-1,-1,1, 1,-2,0,2, 0};
int dy[12] = {0 ,1,0,-1,-1, 1,1,-1, 0,2,0,-2};

int ok(int i, int j)
{
    return (i>=1 && j>=1 && i<=n && j<=m);
}

int updateMuchie(int x, int y)
{
    int i;
    for(i=1; i<=M[0].index; ++i)
        if(M[i].coord.first==x && M[i].coord.second==y)return M[i].index;

    ++M[0].index;
    M[M[0].index].coord.first   = x;
    M[M[0].index].coord.second  = y;
    M[M[0].index].index         = M[0].index;

    return M[M[0].index].index;
}

void Euler(int i)
{
    int j, nod, jj;
    for(j=0; j<v[i].size(); ++j){
        if(v[i][j]!=0){
            nod=v[i][j];
            v[i][j]=0;
            for(jj=0; jj<v[nod].size(); ++jj){
                if(v[nod][jj]==i){
                    v[nod][jj]=0;
                    break;
                }
            }
            Euler(nod);
        }
    }
    g<<M[i].coord.first<<' '<<M[i].coord.second<<'\n';
}

int main()
{
    short int prob;
    int i, j, x, y, r, ii, jj, dir;

    f >> prob >> n >> m >> X >> Y >> k;

    for(i=1; i<=k; ++i){
        f >> x >> y >> r;

        switch(r){
            case 0:{
                a[x][y]=-1;
                break;
            }
            case 1:{
                a[x][y]=-1;
                for(dir=0; dir<4; ++dir){
                    ii = x+dx[dir];
                    jj = y+dy[dir];
                    if(ok(ii, jj))
                        a[ii][jj] = -1;
                }
                break;
            }
            case 2:{
                a[x][y] = -1;
                for(dir=0; dir<12; ++dir){
                    ii = x+dx[dir];
                    jj = y+dy[dir];
                    if(ok(ii, jj))
                        a[ii][jj]=-1;
                }
                break;
            }
        }
    }

    f >> G;
    for(i=1; i<=G; ++i){
        int nod1, nod2;
        f >> x >> y >> ii >> jj;

        if(a[x][y]==0)  a[x][y]     = -2;
        if(a[ii][jj]==0)a[ii][jj]   = -2;

        nod1 = updateMuchie(x, y);
        nod2 = updateMuchie(ii, jj);

        v[nod1].push_back(nod2);
        v[nod2].push_back(nod1);
    }

    switch(prob){
        case 1:{
            if(a[X][Y] == -2)
                g << X << ' ' << Y << ' ' << 0;
            else{
                g << "LEE IN PROGRESS";
            }
            break;
        }
        case 2:{
            for(i=1; i<=M[0].index; ++i)
                if(a[M[i].coord.first][M[i].coord.second]!=-1){
                    Euler(i);
                    break;
                }
            break;
        }
    }

    g.close();
    return 0;
}