Cod sursa(job #1516846)

Utilizator refugiatBoni Daniel Stefan refugiat Data 3 noiembrie 2015 17:25:49
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.14 kb
#include<iostream>
#include<fstream>
#include<queue>
#include<bitset>
#include<algorithm>
#include<cstring>
using namespace std;
const int NMAX=1005;
ifstream si("barbar.in");
ofstream so("barbar.out");
char v[NMAX][NMAX];
int dd[NMAX][NMAX];

struct pct
{
    int cx,cy,lg;
};
int dir[][2]={{0,1},{1,0},{-1,0},{0,-1}};

queue<pct> q;
void bfs(int st,int dr)
{
    pct p;
    int x,y,l;
    p.cx=st;
    p.cy=dr;
    p.lg=1;
    q.push(p);
    int i;
    while(!q.empty())
    {
        p=q.front();
        x=p.cx;
        y=p.cy;
        l=p.lg;
        //cout<<x<<' '<<y<<' '<<l<<'\n';
        for(i=0;i<4;++i)
        {
            if(v[x+dir[i][0]][y+dir[i][1]]!='*')
            {
                if(dd[x+dir[i][0]][y+dir[i][1]]>l||dd[x+dir[i][0]][y+dir[i][1]]==-1)
                {
                    dd[x+dir[i][0]][y+dir[i][1]]=l;
                    p.cx=x+dir[i][0];
                    p.cy=y+dir[i][1];
                    p.lg=l+1;
                    q.push(p);
                }
            }
        }
        q.pop();
    }

}
int mm[NMAX][NMAX];
void parcurg(int sx,int sy,int fx,int fy)
{
    //mm[sx][sy]=dd[sx][sy];
    queue<pct>q;
    pct p;
    p.cx=sx;
    p.cy=sy;
    p.lg=dd[sx][sy];
    q.push(p);
    int l,i;
    while(!q.empty())
    {
        p=q.front();
        q.pop();
        sx=p.cx;
        sy=p.cy;
        l=p.lg;
        if(mm[sx][sy]<l)
        {
            mm[sx][sy]=l;
            if(v[sx][sy]!='O')
            {
                for(i=0;i<4;++i)
                {
                    if(v[sx+dir[i][0]][sy+dir[i][1]]!='*')
                    {
                        p.cx=sx+dir[i][0];
                        p.cy=sy+dir[i][1];
                        p.lg=min(l,dd[sx+dir[i][0]][sy+dir[i][1]]);
                        q.push(p);
                    }

                }
            }
        }
    }
}
int main()
{

    int n,m;
    si>>n>>m;
    int i,j;
    ++n;
    ++m;
    memset(dd,-1,sizeof dd);
    int cxs,cys,cyf,cxf;
    for(i=1;i<n;++i)
    {
        for(j=1;j<m;j++)
        {
            si>>v[i][j];
            if(v[i][j]=='I')
            {
                cxs=i;
                cys=j;
            }
            else
            {
                if(v[i][j]=='O')
                {
                    cxf=i;
                    cyf=j;
                }
                else
                {
                    if(v[i][j]=='D')
                    {
                        dd[i][j]=0;
                    }
                }
            }
        }
        v[i][0]='*';
        v[i][m]='*';
    }
    for(i=0;i<=m;++i)
    {
        v[0][i]='*';
        v[n][i]='*';
    }



    for(i=1;i<n;++i)
    {
        for(j=1;j<m;++j)
        {
            if(v[i][j]=='D')
                bfs(i,j);
        }
    }
    for(i=1;i<n;++i)
    {
        for(j=1;j<m;++j)
        {
            cout<<dd[i][j]<<' ';
        }
        cout<<'\n';
    }
    memset(mm,-1,sizeof mm);
    parcurg(cxs,cys,cxf,cyf);
    so<<mm[cxf][cyf]<<'\n';
    so.close();
    si.close();
    return 0;
}