Cod sursa(job #2978281)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 13 februarie 2023 16:57:51
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include<bits/stdc++.h>
using namespace std;
ifstream F("cartite.in");
ofstream G("cartite.out");
int n,m,a[201][201],b,c,d,k,g,x[]={-1,0,1,0},l,t,p,q,r,s,u,v,w,e,f[40001],i,B[40001],C[40001],U,V,D,E,H[201][201],Z=40001,j;
list<int> z[40001];
int main()
{
    for(F>>b>>n>>m>>c>>d>>k,e=max(n,m);k--;)
        if(F>>u>>v>>w,!w)
            a[u][v]=1;
        else if(w==1) {
            for(a[u][v]=1,l=0;l<4;++l)
                if(u+x[l]&&v+x[3-l]&&u+x[l]<=n&&v+x[3-l]<=m)
                    a[u+x[l]][v+x[3-l]]=1;
        } else
            for(a[u][v]=1,l=-2;l<3;++l)
                for(t=-2;t<3;++t)
                    if(abs(l)+abs(t)<3&&u+l>0&&v+t>0&&u+l<=n&&v+t<=m)
                        a[u+l][v+t]=1;
    for(u=0,w=0,F>>g;g--;) {
        if(F>>p>>q>>r>>s,z[(p-1)*e+q].push_back((r-1)*e+s),!u&&!w&&a[p][r]!=1)
            u=p,w=q;
        if(!a[p][q])
            a[p][q]=2;
        if(!a[r][s])
            a[r][s]=2;
    }
    if(b==2) {
        for(v=1,f[1]=(u-1)*e+w;v;G<<f[v]/e+1<<' '<<f[v]%e<<'\n',--v)
            for(g=f[v];!z[g].empty();)
                i=z[g].front(),z[g].pop_front(),z[i].erase(find(z[i].begin(),z[i].end(),g)),f[++v]=g=i;
        return 0;
    }
    for(U=0,V=0,B[V]=c,C[V++]=d,H[c][d]=1;U<V;++U)
        for(D=B[U],E=C[U],k=0;k<4;++k)
            if(D+x[k]&&E+x[3-k]&&D+x[k]<=n&&E+x[3-k]<=m&&!H[D+x[k]][E+x[3-k]]&&a[D+x[k]][E+x[3-k]]!=1)
                H[D+x[k]][E+x[3-k]]=H[D][E]+1,B[V]=D+x[k],C[V++]=E+x[3-k];
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            if(a[i][j]==2&&Z>H[i][j]-1)
                Z=H[i][j]-1,k=i,l=j;
    return G<<k<<' '<<l<<' '<<Z,0;
}