Cod sursa(job #1861133)

Utilizator silkMarin Dragos silk Data 28 ianuarie 2017 16:58:24
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <cstdio>
#include <vector>
#define VMax 1000000
#define NMax 1002
#define oo 1<<30
#define x first
#define y second
using namespace std;

typedef pair<int, int> Per;
vector<Per> q[VMax+1];
Per COADA[VMax+1];
int d[NMax+1][NMax+1];
char is[NMax+1][NMax+1];
char a[NMax+1][NMax+1];
char s[NMax+1];

int dirx[4]={-1,0,1,0};
int diry[4]={0,1,0,-1};

int main(){
    FILE* fin = fopen("barbar.in","r");
    FILE* fout = fopen("barbar.out","w");

    int N,M,i,j,k,x,y,x2,y2,xi,yi,xf,yf,inc,sf,res;

    fscanf(fin,"%d %d\n",&N,&M);
    for(i = 1; i <= N; ++i)
    {
        fgets(s,NMax,fin);
        for(j = 1; j <= M; ++j) { a[i][j] = s[j-1]; d[i][j] = oo; }
    }

    for(i = 0; i <= N+1; ++i) a[i][0] = a[i][M+1] = '*';
    for(i = 0; i <= M+1; ++i) a[0][i] = a[N+1][i] = '*';

    inc = 0; sf = -1;
    for(i = 1; i <= N; ++i)
        for(j = 1; j <= M; ++j)
        if(a[i][j] == 'I') xi = i, yi = j;
        else if(a[i][j] == 'O') xf = i, yf = j;
        else if(a[i][j] == 'D') COADA[++sf] = {i,j}, d[i][j] = 0;

    a[xf][yf] = '.';
    while(inc <= sf)
    {
        x = COADA[inc].x;
        y = COADA[inc++].y;
        for(k = 0; k < 4; ++k)
        {
            x2 = x+dirx[k];
            y2 = y+diry[k];
            if(a[x2][y2] != '*' && d[x2][y2] == oo )
            {
                d[x2][y2] = d[x][y] + 1;
                COADA[++sf] = {x2,y2};
            }
        }
    }

    inc = sf = 0;
    is[xi][yi] = 1;
    res = d[xi][yi]+1;
    COADA[0] = {xi,yi};
    while(!is[xf][yf] && res)
    {
        for(--res, i = 0; i < q[res].size(); ++i) COADA[++sf] = q[res][i];
        while(inc <= sf)
        {
            x = COADA[inc].x;
            y = COADA[inc++].y;
            for(k = 0; k < 4; ++k)
            {
                x2 = x+dirx[k];
                y2 = y+diry[k];
                if(!is[x2][y2] && a[x2][y2] == '.')
                {
                    if(d[x2][y2] < res) q[ d[x2][y2] ].push_back({x2,y2});
                    else{
                        is[x2][y2] = 1;
                        COADA[++sf] = {x2,y2};
                    }
                }
            }
        }
    }

    if(!is[xf][yf]) fprintf(fout,"-1\n");
    else fprintf(fout,"%d\n",res);



return 0;
}