Cod sursa(job #1256209)

Utilizator sebinechitasebi nechita sebinechita Data 5 noiembrie 2014 21:47:58
Problema Car Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("car.in");
ofstream fout("car.out");
#define MAX 502

int a[MAX][MAX], b[MAX][MAX];
int Q[2][8*MAX*MAX];

int dir[8][2]={{0, 1},
{1, 1},
{1, 0},
{1, -1},
{0, -1},{-1, -1},{-1, 0},{-1, 1}};

int codify(int x, int y, int dir)
{
    return (((x<<9)+y)<<3)+dir;
}

struct sebi{
    int x, y, dir;
};

sebi decodify(int a)
{
    sebi s;
    s.dir=a&7;
    a>>=3;
    s.y=a&511;
    a>>=9;
    s.x=a;
    return s;
}

int n, m;

inline bool on_map(int x, int y)
{
    if(!x || !y || x>n || y>m)
        return 0;
    return 1;
}

int main()
{
    int x1, x2, y1, y2, i, j;
    fin>>n>>m;
    fin>>x1>>y1>>x2>>y2;
    if(x1==x2 && y1==y2)
    {
        fout << "0\n";
        return 0;
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            fin>>a[i][j];
        }
    }

    for(i=0;i<=7;i++)
    {
        Q[0][++Q[0][0]]=codify(x1, y1, i);
    }
    for(i=0;!b[x2][y2] && Q[i&1][0];i++)
    {
        while(Q[i&1][0])
        {
            int nod=Q[i&1][Q[i&1][0]];
            Q[i&1][0]--;
            sebi s=decodify(nod);
            if((b[s.x][s.y]&(1<<s.dir)))
               continue;
            b[s.x][s.y]+=(1<<s.dir);
            s.x+=dir[s.dir][0];
            s.y+=dir[s.dir][1];
            if(on_map(s.x, s.y) && !a[s.x][s.y] && !(b[s.x][s.y]&(1<<s.dir)))
            {
                Q[i&1][++Q[i&1][0]]=codify(s.x, s.y, s.dir);
            }
            s.x-=dir[s.dir][0];
            s.y-=dir[s.dir][1];
            for(j=-1;j<=1;j+=2)
            {
                s.dir+=j+8;
                s.dir&=7;
                if(!(b[s.x][s.y]&(1<<s.dir)))
                {
                    Q[(i+1)&1][++Q[(i+1)&1][0]]=codify(s.x, s.y, s.dir);
                }
                s.dir=s.dir-j+8;
                s.dir&=7;
            }
        }
    }
    if(!b[x2][y2])
        i=0;
    fout << i-1 << "\n";
}