Cod sursa(job #1702147)

Utilizator LucianTLucian Trepteanu LucianT Data 14 mai 2016 16:46:57
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>
#define maxN 1005
#define INF (1<<30)
using namespace std;
int n,i,j,jj,ii,m,xs,ys,xf,yf;
int dr[maxN][maxN];
int d[maxN][maxN];
int a[maxN][maxN];
char s[maxN];
bool ok;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
deque<pair<int,int> > q;
inline bool cont(int x,int y)
{
    if(x>0 && x<=n && y>0 && y<=m)
        return true;
    return false;
}
void lee(int a[maxN][maxN])
{
    int x,y;
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        q.pop_front();
        for(int k=0;k<4;k++)
        {
            if(cont(x+dx[k],y+dy[k]))
                if(a[x+dx[k]][y+dy[k]]!=-1 && a[x+dx[k]][y+dy[k]]>a[x][y]+1)
                a[x+dx[k]][y+dy[k]]=a[x][y]+1,q.push_back(make_pair(x+dx[k],y+dy[k]));
        }
    }
}
void Lee(int a[maxN][maxN])
{
    int x,y;
    a[xs][ys]=dr[xs][ys];
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        q.pop_front();
        for(int k=0;k<4;k++)
        {
            if(cont(x+dx[k],y+dy[k]))
                if(a[x+dx[k]][y+dy[k]]!=-1 && min(a[x][y],dr[x+dx[k]][y+dy[k]])>a[x+dx[k]][y+dy[k]])
                a[x+dx[k]][y+dy[k]]=min(a[x][y],dr[x+dx[k]][y+dy[k]]),q.push_back(make_pair(x+dx[k],y+dy[k]));
        }
    }
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d %d\n",&n,&m);
    for(i=1;i<=n;i++)
    {
        gets(s+1);
        for(j=1;j<=m;j++)
        {
            if(s[j]=='.')
                dr[i][j]=INF,d[i][j]=0;
            if(s[j]=='*')
                dr[i][j]=-1,d[i][j]=-1;
            if(s[j]=='D')
                d[i][j]=-1,q.push_back(make_pair(i,j));
            if(s[j]=='I')
                dr[i][j]=INF,xs=i,ys=j;
            if(s[j]=='O')
                xf=i,yf=j,dr[i][j]=INF;
        }
    }
    lee(dr);
    q.push_back(make_pair(xs,ys));
    Lee(d);
    if(!d[xf][yf])
        printf("-1");
    else printf("%d",d[xf][yf]);
    return 0;
}