Cod sursa(job #2296732)

Utilizator cahemanCasian Patrascanu caheman Data 4 decembrie 2018 23:14:46
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.67 kb
#include<cstdio>
#include<queue>
#include<cstring>

using namespace std;

char mat[1005][1005], viz[1005][1005];
int dist[1005][1005];

struct poz
{
    int x,y;
};

queue <poz> q[2], dragonasi, qc;

int solve(poz start, poz finish)
{
    poz a, curent;
    qc.push(start);
    viz[start.x][start.y] = 1;
while(!qc.empty())
        {
            curent = qc.front();
            a.x = curent.x + 1;
            a.y = curent.y;
            if(a.x < 1000)
            if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
            {
                qc.push(a);
                viz[a.x][a.y] = 1;
            }
            a.x = curent.x - 1;
            a.y = curent.y;
            if(a.x > 1)
            if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
            {
                    qc.push(a);
                viz[a.x][a.y] = 1;
            }
            a.x = curent.x;
            a.y = curent.y + 1;
            if(a.y < 1000)
            if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
            {
                qc.push(a);
                viz[a.x][a.y] = 1;
            }
            a.x = curent.x;
            a.y = curent.y - 1;
            if(a.y > 1)
            if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
            {
               qc.push(a);
                viz[a.x][a.y] = 1;
            }
            qc.pop();
        }
        if(viz[finish.x][finish.y] == 0)
            return -1;
        return 1;
}

int main()
{
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    int r, col, i, j;
    poz start, finish;
    poz a,b, curent;
    scanf("%d%d\n", &r, &col);
    for(i = 1; i <= r; ++ i)
        scanf("%s", &mat[i]);
    for(i = 1; i <= r; ++ i)
        for(j = 1; j <= col; ++ j)
        {
            if(mat[i][j] == 'D')
            {
                a.x = i;
                a.y = j;
                dragonasi.push(a);
                viz[i][j] = 1;
                //mat[i][j] = '*';
            }
            if(mat[i][j] == 'I')
            {
                start.y = j;
                start.x = i;
            }
            if(mat[i][j] == 'O')
            {
                finish.x = i;
                finish.y = j;
            }
        }
    for(i = 0; i <= r + 1; ++ i)
        mat[i][0] = mat[i][col + 1] = '*';
    for(i = 0; i <= col + 1; ++ i)
        mat[0][i] = mat[r + 1][i] = '*';
    while(!(dragonasi.empty()))
    {
        curent = dragonasi.front();
        a.x = curent.x + 1;
        a.y = curent.y;
        if(viz[a.x][a.y] == 0 && mat[a.x][a.y] != '*')
        {
            dist[a.x][a.y] = dist[curent.x][curent.y] + 1;
            dragonasi.push(a);
            viz[a.x][a.y] = 1;
        }
        a.x = curent.x - 1;
        a.y = curent.y;
        if(viz[a.x][a.y] == 0 && mat[a.x][a.y] != '*')
        {
            dist[a.x][a.y] = dist[curent.x][curent.y] + 1;
            dragonasi.push(a);
            viz[a.x][a.y] = 1;
        }
        a.x = curent.x;
        a.y = curent.y + 1;
        if(viz[a.x][a.y] == 0 && mat[a.x][a.y] != '*')
        {
            dist[a.x][a.y] = dist[curent.x][curent.y] + 1;
            dragonasi.push(a);
            viz[a.x][a.y] = 1;
        }
        a.x = curent.x;
        a.y = curent.y - 1;
        if(viz[a.x][a.y] == 0 && mat[a.x][a.y] != '*')
        {
            dist[a.x][a.y] = dist[curent.x][curent.y] + 1;
            dragonasi.push(a);
            viz[a.x][a.y] = 1;
        }
        dragonasi.pop();
    }
    for(i = 1; i <= 1000; ++ i)
        for(j = 1; j <= 1000; ++ j)
            viz[i][j] = 0;
    //if(solve(start, finish) == -1)
    //{
    //    printf("-1");
    //    return 0;
    //}
    for(i = 1; i <= 1000; ++ i)
        for(j = 1; j <= 1000; ++ j)
            viz[i][j] = 0;
    i = dist[start.x][start.y];
    q[i&1].push(start);
    while(viz[finish.x][finish.y] == 0 && i >= 1)
    {
        while(!q[i&1].empty())
        {
            curent = q[i&1].front();
            viz[curent.x][curent.y] = 1;
            q[i&1].pop();
            qc.push(curent);
        }
        while(!qc.empty())
        {
            curent  = qc.front();
            a.x = curent.x + 1;
            a.y = curent.y;
            if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
            {
                if(dist[a.x][a.y] >= i)
                    qc.push(a);
                else
                    q[1 - (i&1)].push(a);
                viz[a.x][a.y] = 1;
            }
            a.x = curent.x - 1;
            a.y = curent.y;
            if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
            {
                if(dist[a.x][a.y] >= i)
                    qc.push(a);
                else
                    q[1 - (i&1)].push(a);
                viz[a.x][a.y] = 1;
            }
            a.x = curent.x;
            a.y = curent.y + 1;
            if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
            {
                if(dist[a.x][a.y] >= i)
                    qc.push(a);
                else
                    q[1 - (i&1)].push(a);
                viz[a.x][a.y] = 1;
            }
            a.x = curent.x;
            a.y = curent.y - 1;
            if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
            {
                if(dist[a.x][a.y] >= i)
                    qc.push(a);
                else
                    q[1 - (i&1)].push(a);
                viz[a.x][a.y] = 1;
            }
            qc.pop();
        }
        -- i;
    }
	if(i==0)
	{
	printf("-1");
	return 0;
	}
    ++ i;
    if(i > dist[finish.x][finish.y])
        i = dist[finish.x][finish.y];
    printf("%d", i);
    return 0;
}