Cod sursa(job #1721248)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 24 iunie 2016 23:00:37
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

struct poz
{
    int x,y;
} in,sf,aux;

queue <poz> q;

int ox[]={-1,0,1,0};
int oy[]={0,1,0,-1};

int mat[1005][1005],d[1005][1005];
bool inq[1005][1005];
char s[1005];

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    int n,m,i,j,nr;

    scanf("%d%d\n",&n,&m);

    for(i=1;i<=n;i++)
    {
        gets(s);

        for(j=0;j<m;j++)
        {
            if(s[j]=='I') in.x=i, in.y=j+1;
            if(s[j]=='O') sf.x=i, sf.y=j+1;
            if(s[j]=='D')
            {
                mat[i][j+1]=-1;
                aux.x=i, aux.y=j+1;
                q.push(aux);
            }
            if(s[j]=='*')
            {
                mat[i][j+1]=-1;
                d[i][j+1]=-1;
            }
        }
    }

    for(i=0;i<=n+1;i++)
    {
        mat[i][0]=-1;
        mat[i][m+1]=-1;
        d[i][0]=-1;
        d[i][m+1]=-1;
    }
    for(j=0;j<=m+1;j++)
    {
        mat[0][j]=-1;
        mat[n+1][j]=-1;
        d[0][j]=-1;
        d[n+1][j]=-1;
    }

    while(!q.empty())
    {
        for(int k=0;k<4;k++)
        {
            aux.x=q.front().x+ox[k];
            aux.y=q.front().y+oy[k];

            if(d[aux.x][aux.y]==0)
            {
                d[aux.x][aux.y]=d[q.front().x][q.front().y]+1;
                q.push(aux);
            }
        }

        q.pop();
    }

    /*for(i=0;i<=n+1;i++)
    {
        for(j=0;j<=m+1;j++) printf("%d ",mat[i][j]);
        printf("\n");
    }*/

    mat[in.x][in.y]=d[in.x][in.y];
    q.push(in);
    inq[in.x][in.y]=1;

    while(!q.empty())
    {
        for(int k=0;k<4;k++)
        {
            aux.x=q.front().x+ox[k];
            aux.y=q.front().y+oy[k];
            nr=min(mat[q.front().x][q.front().y], d[aux.x][aux.y]);

            if(mat[aux.x][aux.y]==-1) continue;
            if(mat[aux.x][aux.y]==0)
            {
                mat[aux.x][aux.y]=nr;
                q.push(aux);
                inq[aux.x][aux.y]=1;
            }
            else
            {
                 if(nr>mat[aux.x][aux.y])
                 {
                     mat[aux.x][aux.y]=nr;
                     if(inq[aux.x][aux.y]==0)
                     {
                         q.push(aux);
                         inq[aux.x][aux.y]=1;
                     }
                 }
            }

        }

        inq[q.front().x][q.front().y]=0;
        q.pop();
    }

    printf("%d\n",mat[sf.x][sf.y]);


    return 0;
}