Cod sursa(job #953693)

Utilizator misinozzz zzz misino Data 26 mai 2013 23:50:46
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include<fstream>
#include<queue>
#include<vector>
#define punct pair<int,int>
#define x first
#define INF 999999999
#define y second
#define mp make_pair
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int i,j,n,m,p,u,ok,xx,nxx,yy,nyy,dir;
int d[1010][1010],b[1010][1010];
bool a[1010][1010];
vector<punct>v;
punct q[1000100];
punct pi,pf;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
char s[1100];
inline bool ein(int x,int y)
{
    if(x<0||y<0||x>n||y>n)
    return 0;
    return 1;
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
    {
        f>>(s+1);
        for(j=1;j<=m;++j)
        {
            if(s[j]=='*')
            a[i][j]=1;
            if(s[j]=='I')
            pi.x=i,pi.y=j;
            if(s[j]=='O')
            pf.x=i,pf.y=j;
            if(s[j]=='D')
            v.push_back(mp(i,j));
        }
    }
    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    d[i][j]=INF;
    for(vector<punct>::iterator it=v.begin(),fin=v.end();it!=fin;++it)
    {
        d[it->x][it->y]=0;
        ++u;
        q[u]=*it;
//        q.push(*it);
    }
    p=1;
    while(p<=u)
    {
        xx=q[p].x;
        yy=q[p].y;
        ++p;
        for(dir=0;dir<=3;++dir)
        {
            nxx=xx+dx[dir];
            nyy=yy+dy[dir];
            if(!ein(nxx,nyy))
            continue;
            if(a[nxx][nyy]||d[xx][yy]+1>=d[nxx][nyy])
            continue;
            d[nxx][nyy]=1+d[xx][yy];
            ++u;
            q[u]=mp(nxx,nyy);
//            q.push(mp(nxx,nyy));
        }
    }
    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    b[i][j]=-1;
    b[pi.x][pi.y]=d[pi.x][pi.y];
    p=u=1;
    q[1]=pi;
//    q.push(pi);
    while(p<=u)
    {
        xx=q[p].x;
        yy=q[p].y;
        ++p;
        if(xx==pf.x&&yy==pf.y)
        ok=1;
        for(dir=0;dir<=3;++dir)
        {
            nxx=xx+dx[dir];
            nyy=yy+dy[dir];
            if(!ein(nxx,nyy))
            continue;
            if(a[nxx][nyy]==0&&min(b[xx][yy],d[nxx][nyy])>b[nxx][nyy])
            {
                ++u;
                q[u]=mp(nxx,nyy);
                b[nxx][nyy]=min(b[xx][yy],d[nxx][nyy]);
            }
        }
    }
    if(!ok)
    g<<-1<<'\n';
    else
    g<<b[pf.x][pf.y]<<'\n';
    return 0;
}