Cod sursa(job #1733985)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 26 iulie 2016 11:54:49
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.84 kb
//Cine a facut sursa e BO$$
//Sursa by Ionut Anghelina
#include<bits/stdc++.h>
using namespace std;
deque<int> q1,q2;
int r,c,xi,yi,xf,yf,a[1005][1005],b[1005][1005],d[5][3],m[1005][1005],x;
char c1,s[1005];
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d",&r,&c);
    for(int i=1;i<=r;i++)
    {
        scanf("\n");
        scanf("%s",&s);
        for(int j=0;j<strlen(s);j++)
        {
            m[i][j+1]=-1;
            if (s[j]=='.')
            {
                b[i][j+1]=INT_MAX;
            }
                else
            if (s[j]=='I')
            {
                xi=i;
                yi=j+1;
                b[i][j+1]=INT_MAX;
            }
                else
            if (s[j]=='O')
            {
                xf=i;
                yf=j+1;
                b[i][j+1]=INT_MAX;
            }
                else
            if (s[j]=='D')
            {
                a[i][j+1]=-1;
                b[i][j+1]=0;
                q1.push_front(i);
                q2.push_front(j+1);
            }
                else
            {
                 a[i][j]=-1;
                b[i][j]=-1;
            }
        }
    }
   /* for(int i=1;i<=r;i++)
    {
        scanf("\n");
        for(int j=1;j<=c;j++)
        {
            m[i][j]=-1;
            scanf("%c",&c1);
            if (c1=='.')
            {
                b[i][j]=INT_MAX;
            }
                else
            if (c1=='I')
            {
                xi=i;
                yi=j;
                b[i][j]=INT_MAX;
            }
                else
            if (c1=='O')
            {
                xf=i;
                yf=j;
                b[i][j]=INT_MAX;
            }
                else
            if (c1=='D')
            {
                a[i][j]=-1;
                b[i][j]=0;
                q1.push_front(i);
                q2.push_front(j);
            }
                else
            {
                a[i][j]=-1;
                b[i][j]=-1;
            }
        }
    }*/
    d[1][1]=-1;
    d[1][2]=0;
    d[2][1]=1;
    d[2][2]=0;
    d[3][1]=0;
    d[3][2]=-1;
    d[4][1]=0;
    d[4][2]=1;
    for(int i=0;i<=(c+1);i++)
    {
        a[0][i]=a[r+1][i]=-2;
    }
    for(int i=0;i<=(r+1);i++)
    {
        a[i][0]=a[i][c+1]=-2;
    }
    while (!q1.empty())
    {
        for(int i=1;i<=4;i++)
        {
            {
                if (a[q1.front()+d[i][1]][q2.front()+d[i][2]]>=0)
                {
                    if (b[q1.front()+d[i][1]][q2.front()+d[i][2]]>(b[q1.front()][q2.front()]+1))
                    {
                        b[q1.front()+d[i][1]][q2.front()+d[i][2]]=b[q1.front()][q2.front()]+1;
                        q1.push_back(q1.front()+d[i][1]);
                        q2.push_back(q2.front()+d[i][2]);
                    }
                }
            }
        }
        q1.pop_front();
        q2.pop_front();
    }
    q1.push_front(xi);
    q2.push_front(yi);
   /* for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
            printf("%d ",b[i][j]);
        printf("\n");
    }*/
    m[xi][yi]=b[xi][yi];
    while (!q1.empty())
    {
        for(int i=1;i<=4;i++)
        {
            if (a[q1.front()+d[i][1]][q2.front()+d[i][2]]>(-1))
            {
                x=min(b[q1.front()+d[i][1]][q2.front()+d[i][2]],m[q1.front()][q2.front()]);
                if(x>m[q1.front()+d[i][1]][q2.front()+d[i][2]])
                {
                    m[q1.front()+d[i][1]][q2.front()+d[i][2]]=x;
                    q1.push_back(q1.front()+d[i][1]);
                    q2.push_back(q2.front()+d[i][2]);
                }
            }
        }
        q1.pop_front();
        q2.pop_front();
    }
    printf("%d\n",m[xf][yf]);
    return 0;
}