Cod sursa(job #2300888)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 12 decembrie 2018 11:43:45
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <bits/stdc++.h>

using namespace std;

queue <int> q1,q2;
vector <int> v[3001];


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


int n,k,i,j,p1,L,nr,t,suma,T,lungime,p2,I,J,s1[5],s2[5],s3[5],s4[5],b[60][60],a[60][60],A[60][60],c[60][60];


void reconstit (int i,int j,int lungime)
{
    if(lungime>=1)
        {
            A[i][j]++;
            if(b[i-1][j]==lungime-1)reconstit(i-1,j,lungime-1);
            if(b[i+1][j]==lungime-1)reconstit(i+1,j,lungime-1);
            if(b[i][j+1]==lungime-1)reconstit(i,j+1,lungime-1);
            if(b[i][j-1]==lungime-1)reconstit(i,j-1,lungime-1);
        }

}

int main()
{
    f>>n>>k;

    for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
        {
            f>>a[i][j];
            c[i][j]=a[i][j];
        }

    q1.push(1);
    q2.push(1);
    b[1][1]=1;
    a[1][1]=0;

    while(!q1.empty())
    {
        p1=q1.front();
        p2=q2.front();


        if(a[p1+1][p2]!=0){q1.push(p1+1);q2.push(p2);a[p1+1][p2]=0;b[p1+1][p2]=b[p1][p2]+1;}
        if(a[p1-1][p2]!=0){q1.push(p1-1);q2.push(p2);a[p1-1][p2]=0;b[p1-1][p2]=b[p1][p2]+1;}
        if(a[p1][p2+1]!=0){q1.push(p1);q2.push(p2+1);a[p1][p2+1]=0;b[p1][p2+1]=b[p1][p2]+1;}
        if(a[p1][p2-1]!=0){q1.push(p1);q2.push(p2-1);a[p1][p2-1]=0;b[p1][p2-1]=b[p1][p2]+1;}

        q1.pop();
        q2.pop();
    }



    lungime=b[n][n];
    L=lungime;
    reconstit(n,n,lungime);





    T=A[1][1];
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(A[i][j]!=0)A[i][j]=T-A[i][j]+1;



   // g<<L<<'\n';

    lungime=1;
    nr=1;
    i=1;j=1;
    while(lungime<=L)
    {

        t=0;
      //  cout<<i<<" "<<j<<'\n';
       // cout<<lungime<<" "<<i<<" "<<j<<'\n';
        if(b[i+1][j]==lungime+1){t++;s1[t]=A[i+1][j];s2[t]=c[i+1][j];s3[t]=i+1;s4[t]=j;}
        if(b[i-1][j]==lungime+1){t++;s1[t]=A[i-1][j];s2[t]=c[i-1][j];s3[t]=i-1;s4[t]=j;}
        if(b[i][j+1]==lungime+1){t++;s1[t]=A[i][j+1];s2[t]=c[i][j+1];s3[t]=i;s4[t]=j+1;}
        if(b[i][j-1]==lungime+1){t++;s1[t]=A[i][j-1];s2[t]=c[i][j-1];s3[t]=i;s4[t]=j-1;}


        for(I=1;I<=t;I++)
        {
            for(J=I+1;J<=t;J++)
                if(s1[I]>s1[J])
                {
                 swap(s1[I],s1[J]);
                 swap(s2[I],s2[J]);
                 swap(s3[I],s3[J]);
                 swap(s4[I],s4[J]);
                }
        }

        suma=0;

        for(I=1;I<=t;I++)
        {
            suma=suma+s1[I];
          //  cout<<suma<<" ";
            if(suma>=k){break;}
        }
      //  cout<<'\n';
       g<<c[i][j]<<" ";
   // cout<<'\n';
        i=s3[I];
        j=s4[I];
        lungime++;
    }

    return 0;
}