Cod sursa(job #1496053)

Utilizator nimicLeoveanu Mihaita Alexandru nimic Data 4 octombrie 2015 10:47:52
Problema Car Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>
using namespace std;
ifstream in("car.in");
ofstream out("car.out");

const int nmax = 506, mmax = 8, dmax = 7, ymax = 4090, xmax = 2093060;
int v[nmax][nmax], vmin[mmax][nmax][nmax], car[nmax * nmax * mmax], n, m, d, sx, sy, fx, fy, sf, s;
int dir[mmax][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};

void add(int sx, int sy,int d,int ct){
	int i, j;
    for( i = sx, j = sy; !v[i][j] ; i += dir[d][0], j += dir[d][1])
        if(!vmin[d][i][j])
		{
            vmin[d][i][j] = ct;

            car[++sf] = (((i<<9) + j)<<3) + d;

            if((i==fx) && (j==fy))
                s = ct;
        }
}
int main (){
	int player_unu=0;

    in>>n>>m;
    in>>sx>>sy>>fx>>fy;
    for(int i = 0;i <=n + 1; i++)
        for(int j = 0; j<=m + 1; j++)
            v[i][j] = 1;

    for(int i = 1; i<=n; i++)
        for(int j = 1; j<=m; j++)
            in>>v[i][j];

	sf = -1;
    for(int i = 0; i<mmax; i++)
        add(sx, sy, i, 1);

    for(int q = 0; (q<=sf) && (!s); q++)
	{
        int i = car[q]>>12;
        int j = (car[q]&ymax)>>3;

        d = car[q] & dmax;

        add(i, j, (d + 1) % mmax, vmin[d][i][j] + 1);
        add(i, j, (d - 1) % mmax, vmin[d][i][j] + 1);
    }

    s--;
    out<<s<<'\n';

    return player_unu;
}