Pagini recente » Cod sursa (job #1383468) | Cod sursa (job #1371153) | Cod sursa (job #2648569) | Cod sursa (job #682261) | Cod sursa (job #1256201)
#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][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;
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);
b[x1][y1]+=(1<<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]--];
sebi s=decodify(nod);
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)))
{
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)))
{
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";
}