Cod sursa(job #953685)

Utilizator misinozzz zzz misino Data 26 mai 2013 23:39:05
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 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,ok,xx,nxx,yy,nyy,dir;
int d[1010][1010],b[1010][1010];
bool a[1010][1010];
vector<punct>v;
queue<punct>q;
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;
        q.push(*it);
    }
    while(!q.empty())
    {
        xx=q.front().x;
        yy=q.front().y;
        q.pop();
        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];
            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];
    q.push(pi);
    while(!q.empty())
    {
        xx=q.front().x;
        yy=q.front().y;
        q.pop();
        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])
            {
                q.push(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;
}