Cod sursa(job #1391931)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 18 martie 2015 11:49:28
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.11 kb
#include <cstdio>
int m,n;
struct str
{
       int x;
       int y;
}qu[1000101];
int ps=0,i1,i2,s1,s2;
int a[1005][1005],ver[1005][1005],mij,vmax;
void bfs(int pos)
{
     if(pos==ps) return;
     if(qu[pos].y<m&&a[qu[pos].x][qu[pos].y+1]>a[qu[pos].x][qu[pos].y]+1)
     {
                                a[qu[pos].x][qu[pos].y+1]=a[qu[pos].x][qu[pos].y]+1;
                                qu[ps].x=qu[pos].x;
                                qu[ps].y=qu[pos].y+1;
                                ps++;
     }
     if(qu[pos].y>1&&a[qu[pos].x][qu[pos].y-1]>a[qu[pos].x][qu[pos].y]+1)
     {
                                a[qu[pos].x][qu[pos].y-1]=a[qu[pos].x][qu[pos].y]+1;
                                qu[ps].x=qu[pos].x;
                                qu[ps].y=qu[pos].y-1;
                                ps++;
     }
     if(qu[pos].x<n&&a[qu[pos].x+1][qu[pos].y]>a[qu[pos].x][qu[pos].y]+1)
     {
                                a[qu[pos].x+1][qu[pos].y]=a[qu[pos].x][qu[pos].y]+1;
                                qu[ps].x=qu[pos].x+1;
                                qu[ps].y=qu[pos].y;
                                ps++;
     }
     if(qu[pos].x>1&&a[qu[pos].x-1][qu[pos].y]>a[qu[pos].x][qu[pos].y]+1)
     {
                                a[qu[pos].x-1][qu[pos].y]=a[qu[pos].x][qu[pos].y]+1;
                                qu[ps].x=qu[pos].x-1;
                                qu[ps].y=qu[pos].y;
                                ps++;
     }
     bfs(pos+1);
}
void dfs(int p1,int p2)
{
     ver[p1][p2]=mij;
     if(p1==s1&&p2==s2) return;
     if(p1>1&&(a[p1-1][p2]>=mij||a[p1-1][p2]==-5)&&ver[p1-1][p2]!=mij)
     {
                                                                      dfs(p1-1,p2);
                                                                      if(ver[s1][s2]==mij) return;
     }
     if(p1<n&&(a[p1+1][p2]>=mij||a[p1+1][p2]==-5)&&ver[p1+1][p2]!=mij)
     {
                                                                      dfs(p1+1,p2);
                                                                      if(ver[s1][s2]==mij) return;
     }
     if(p2>1&&(a[p1][p2-1]>=mij||a[p1][p2-1]==-5)&&ver[p1][p2-1]!=mij)
     {
                                                                      dfs(p1,p2-1);
                                                                      if(ver[s1][s2]==mij) return;
     }
     if(p2<m&&(a[p1][p2+1]>=mij||a[p1][p2+1]==-5)&&ver[p1][p2+1]!=mij)
     {
                                                                      dfs(p1,p2+1);
                                                                      if(ver[s1][s2]==mij) return;
     }
}
int main()
{
    freopen ("barbar.in","r",stdin);
    freopen ("barbar.out","w",stdout);
    scanf("%d%d",&n,&m);
    char ch;
    for(int i=1;i<=n;i++)
    {
            scanf("%c",&ch);
            for(int j=1;j<=m;j++)
            {
                    scanf("%c",&ch);
                    if(ch=='*') a[i][j]=-1;
                    else if(ch=='I')
                    {
                         a[i][j]=100000000;
                         i1=i;
                         i2=j;
                    }
                    else if(ch=='O')
                    {
                         a[i][j]=100000000;
                         s1=i;
                         s2=j;
                    }
                    else if(ch=='.') a[i][j]=100000000;
                    else if(ch=='D')
                    {
                         a[i][j]=0;
                         qu[ps].x=i;
                         qu[ps].y=j;
                         ps++;
                    }
            }
    }
    bfs(0);
    int mint=a[i1][i2];
    if(mint>a[s1][s2]) mint=a[s1][s2];
    a[i1][i2]=-10;
    a[s1][s2]=-5;
    int s=0,e=1000000,af=-1;
    while(s<=e)
    {
               mij=(s+e)/2;
               ver[i1][i2]=mij;
               dfs(i1,i2);
               if(ver[s1][s2]!=mij) e=mij-1;
               else
               {
                   af=mij;
                   s=mij+1;
               }
    }
    if(af>mint) af=mint;
    printf("%d\n",af);
}