Cod sursa(job #825376)

Utilizator ericptsStavarache Petru Eric ericpts Data 28 noiembrie 2012 22:32:35
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;


char lab[1002][1002];
int cost[1002][1002];
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,0};
struct cell
{
    int y,x;
};
vector<cell> drag;
int dragoni;
inline int _min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
inline int abs(int a)
{
    if(a<0)
        return -a;
    return a;
}
inline int dist_cell(cell a,cell b)
{
    return (abs(a.x-b.x) + abs(a.y-b.y));
}

int mincell(cell a)
{
    int i;
    int ret = 1<<30;
    for(i=0;i<dragoni;++i)
        ret = _min(ret,dist_cell(a,drag[i]));
    return ret;
}

queue<cell> q;
void lee()
{
    cell c;
    int i;
    while(!q.empty())
    {
        c = q.front();
        q.pop();
        for(i=0;i<4;++i)
                if(lab[c.y + dy[i]][c.x+dx[i]] == '.' || lab[c.y + dy[i]][c.x+dx[i]] == 'O')
                {
                    if
                    (
                       !cost[c.y+dy[i]][c.x+dx[i]]
                        ||
                        (
                            mincell((cell){c.y+dy[i],c.x+dx[i]}) > cost[c.y+dy[i]][c.x+dx[i]]
                                &&
                            cost[c.y][c.x] > cost[c.y+dy[i]][c.x+dx[i]]
                        )
                    )
                    {
                        q.push((cell){c.y+dy[i],c.x+dx[i]});
                        cost[c.y+dy[i]][c.x+dx[i]] = _min(mincell((cell){c.y+dy[i],c.x+dx[i]}),cost[c.y][c.x]);
                    }
                }
    }
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int n,m,i,j;
    setvbuf(stdin,NULL,_IOFBF,4096);
    scanf("%d %d\n",&n,&m);
    cell inceput,sfarsit;
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
        {
            scanf(" %c ",&lab[i][j]);
            if(lab[i][j] == 'I')
                inceput= (cell){i,j};
            else if(lab[i][j] == 'O')
                sfarsit = (cell){i,j};
            else if(lab[i][j] == 'D')
                drag.push_back((cell){i,j});
        }
    }
    dragoni = drag.size();
    q.push(inceput);
    cost[inceput.y][inceput.x] = mincell(inceput);
    lee();
    if(cost[sfarsit.y][sfarsit.x])
        printf("%d\n",cost[sfarsit.y][sfarsit.x]);
    else
        printf("%d\n",-1);
}