Cod sursa(job #1623017)

Utilizator meeprrMelinte Paul meeprr Data 1 martie 2016 16:36:47
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

int map[1001][1001],mapdis[1001][1001],mapparc[1001][1001],distmax;
char cit;
int x1,y1,x2,y2;
int stx[1000001],sty[1000001],stdist[1000001],k,curr=1;
int dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1};

int min(int a,int b)
{
    if (a>b) return b;
    return a;
}

int main()
{
    int n,m;

    f>>n>>m>>ws;

    for(int i=1;i<=n;i++)
       { for(int j=1;j<=m;j++)
            {
                f>>cit;
                if(cit=='.')    map[i][j]=1;
                if(cit=='I')    {x1=i; y1=j;}
                if(cit=='O')    {x2=i; y2=j; map[i][j]=1;}
                if(cit=='D')    {k++; stx[k]=i; sty[k]=j; stdist[k]=1; mapdis[i][j]=1;}
            } f>>ws; }

    while(curr<=k)
    {
        for(int i=1;i<=4;i++)
            if(!mapdis[stx[curr]+dx[i]][sty[curr]+dy[i]])
                {
                    k++;
                    mapdis[stx[curr]+dx[i]][sty[curr]+dy[i]]=stdist[curr]+1;
                    stdist[k]=stdist[curr]+1;
                    stx[k]=stx[curr]+dx[i];
                    sty[k]=sty[curr]+dy[i];
                }
        curr++;
    }

    k=1;
    curr=1;
    stx[k]=x1;
    sty[k]=y1;
    stdist[k]=mapdis[x1][y1];
    distmax=0;
    mapparc[x1][y1]=mapdis[x1][y1];

    while(curr<=k)
    {
        if((stx[curr]==x2) && (sty[curr]==y2))
        {
            if(stdist[curr]>distmax) distmax=stdist[curr];
        }
        for(int i=1;i<=4;i++)
            if((stdist[curr]>mapparc[stx[curr]+dx[i]][sty[curr]+dy[i]]) && (map[stx[curr]+dx[i]][sty[curr]+dy[i]]))
                {
                    mapparc[stx[curr]+dx[i]][sty[curr]+dy[i]]=stdist[curr];
                    k++;
                    stx[k]=stx[curr]+dx[i];
                    sty[k]=sty[curr]+dy[i];
                    stdist[k]=min(stdist[curr],mapdis[stx[curr]+dx[i]][sty[curr]+dy[i]]);
                }
        curr++;
    }

    g<<distmax-1;

    return 0;
}