Cod sursa(job #1516814)

Utilizator refugiatBoni Daniel Stefan refugiat Data 3 noiembrie 2015 16:58:02
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 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;
};
bitset<NMAX> trec[NMAX];
int dir[][2]={{0,1},{1,0},{-1,0},{0,-1}};
void bfs(int st,int dr)
{
    memset(trec,0,sizeof trec);
    pct p;
    queue<pct> q;
    int x,y,l;
    p.cx=st;
    p.cy=dr;
    p.lg=0;
    q.push(p);

    trec[st][dr]=1;
    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]]=='D')
            {
                dd[st][dr]=l+1;
                return;
            }

            if(v[x+dir[i][0]][y+dir[i][1]]!='*'&&trec[x+dir[i][0]][y+dir[i][1]]!=1)
            {
                trec[x+dir[i][0]][y+dir[i][1]]=1;
                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;
    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;
                }
            }
        }
        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'&&v[i][j]!='*')
                bfs(i,j);
            cout<<dd[i][j]<<' ';
        }
        cout<<'\n';
    }*/
    parcurg(cxs,cys,cxf,cyf);
    so<<mm[cxf][cyf]<<'\n';
    so.close();
    si.close();
    return 0;
}