Cod sursa(job #197573)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 5 iulie 2008 10:45:26
Problema Gropi Scor 0
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 1.53 kb
#include <cstdio>

using namespace std;

int m,c,n,a[2][2000000];
int li,ci,lf,cf,pq,uq;
struct coditza {int i,j;} q[4000000];

void fill()
{
    for(int j=0;j<c;j++)
    {
        if(a[0][j]>0)
            a[0][j]=0;
        if(a[1][j]>0)
            a[1][j]=0;
    }
}

void drum(int li, int ci, int lf, int cf)
{
    int i,j;
    pq=uq=0;
    q[pq].i=li;
    q[pq].j=ci;
    a[li][ci]=1;
    while(pq<=uq)
    {
        i=q[pq].i;
        j=q[pq++].j;
        if(i==lf && j==cf)
            break;
        if(j<c-1 && a[i][j+1]==0)
        {
            a[i][j+1]=a[i][j]+1;
            q[++uq].i=i;
            q[uq].j=j+1;
        }
        if(i==0 && a[i+1][j]==0)
        {
            a[i+1][j]=a[i][j]+1;
            q[++uq].i=i+1;
            q[uq].j=j;
        }
        if(j>0 && a[i][j-1]==0)
        {
            a[i][j-1]=a[i][j]+1;
            q[++uq].i=i;
            q[uq].j=j-1;
        }
        if(i==1 && a[i-1][j]==0)
        {
            a[i-1][j]=a[i][j]+1;
            q[++uq].i=i-1;
            q[uq].j=j;
        }
    }
    printf("%d\n",a[lf][cf]);
}

int main()
{
    int x1,x2;
    freopen("gropi.in","r",stdin);
    freopen("gropi.out","w",stdout);
    scanf("%d%d",&c,&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&x1,&x2);
        a[x1-1][x2-1]=-1;
    }
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d%d",&li,&ci,&lf,&cf);
        drum(li-1,ci-1,lf-1,cf-1);
        fill();
    }
    fclose(stdin);
    return 0;
}