Cod sursa(job #1024260)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 8 noiembrie 2013 15:00:50
Problema Factorial Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <fstream>
using namespace std;
ifstream f("marmote.in");
ofstream g("marmote.out");
int n, m, x, l, y, i, j, liv[1001][1001],k;
int verificare(int xf, int yf);
int marcare(int xf, int yf);
int main()
{
    f>>n>>m>>k>>l;
    for(i=1;i<=k;i++)
    {
        f>>x>>y;
        if( verificare(x, y))
        {
            g<<i<<'\n';
            marcare(x, y);
        }
    }

    return 0;
}

int verificare(int xf, int yf)
{

    int xst,xdr,yst,ydr;

    //sus
    if(xf-l>=1&&liv[xf-l][yf]!=0)
       return 0;

    if(xf-l<1)
    {
       yst=yf-(l-xf+1);
       if(yst<1)
       {
           yst=1;
       }
       ydr=yf+(l-xf+1);
       if(ydr>m)
       {
           ydr=m;
       }
       if(liv[1][yst]!=0)
           return 0;
       if (liv[1][ydr]!=0)
           return 0;
    }

    //jos
    if(xf+l<=n&&liv[xf+l][yf]!=0)
       return 0;
    if(xf+l>n)
    {

        yst=yf-(l-(n-xf));
        if(yst<1)
        {
            yst=1;
        }
        ydr=yf+(l-(n-xf));
        if(ydr>m)
        {
            ydr=m;
        }
        if(liv[n][yst]==1)
           return 0;
        if (liv[n][ydr]==1)
           return 0;
    }

    //dreapta
    if(yf+l>m)
    {
        yst=m;
        ydr=m;
        xst=xf-(l-(m-yf));
        if(xst<1)
        {
            xst=1;
        }
        xdr=xf+(l-(m-yf));
        if(xdr>n)
        {
            xdr=n;
        }
        if(liv[xst][yst]==1)
           return 0;
        if (liv[xdr][ydr]==1)
           return 0;
    }
    else
      if(liv[xf][yf+l]!=0)
        return 0;


    //stanga
    if(yf-l<1)
    {
        yst=1;
        ydr=1;
        xst=xf-(l-yf+1);
        if(xst<1)
        {
            xst=1;
        }
        xdr=xf+(l-yf+1);
        if(xdr>n)
        {
            xdr=n;
        }
        if(liv[xst][yst]==1)
           return 0;
        if (liv[xdr][ydr]==1)
           return 0;
    }
    else
       if(liv[xf][yf-l]!=0)
         return 0;
         return 1;
}

int marcare(int xf, int yf)
{
    int yst, ydr;
    for(int i=0;i<=l;i++)
    {
        yst=yf-l+i;
        if(yst<1)
           yst=1;
         ydr=y+l-i;
         if(ydr>m)
            ydr=m;
         for(int j=yst;j<=ydr&&xf-i>=1;j++)
             liv[xf-i][j]=1;

        for(int j=yst;j<=ydr&&xf+i<=n;j++)
             liv[xf+i][j]=1;

    }
}