Cod sursa(job #827432)

Utilizator ericptsStavarache Petru Eric ericpts Data 2 decembrie 2012 00:54:02
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;


char lab[1002][1002];
unsigned int mincell[1002][1002];
bool viz[1002][1002];
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,0};
int costmaxim=0;
struct cell
{
    int y,x;
};
cell inceput,sfarsit;
inline int _min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
queue<cell> q;
void lee2()
{
    cell c;
    int i;
    while(!q.empty())
    {
        c = q.front();
        q.pop();
        if(mincell[c.y][c.x] > costmaxim)
            costmaxim = mincell[c.y][c.x];
        for(i=0;i<4;++i)
        {
            if(lab[c.y+dy[i]][c.x+dx[i]] != '*' && lab[c.y+dy[i]][c.x+dx[i]])
                if(!mincell[c.y+dy[i]][c.x+dx[i]])
                {
                    mincell[c.y+dy[i]][c.x+dx[i]] = mincell[c.y][c.x] + 1;
                    q.push((cell){c.y+dy[i],c.x+dx[i]});
                }

        }
    }
}
bool lee(int cost)
{
    memset(viz,0,sizeof(viz));
    cell c;
    q.push(inceput);
    viz[inceput.y][inceput.x]=1;
    int i;
    while(!q.empty())
    {
        c = q.front();
        q.pop();
        for(i=0;i<4;++i)
                if(lab[c.y + dy[i]][c.x+dx[i]] == '.' || lab[c.y + dy[i]][c.x+dx[i]] == 'O')
                {
                    if(mincell[c.y+dy[i]][c.x+dx[i]] >= cost && !viz[c.y+dy[i]][c.x+dx[i]])
                    {
                        viz[c.y+dy[i]][c.x+dx[i]]=1;
                        q.push((cell){c.y+dy[i],c.x+dx[i]});
                    }
                }
    }
    return viz[sfarsit.y][sfarsit.x];
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int n,m,i,j;
    setvbuf(stdin,NULL,_IOFBF,32768);
    scanf("%d %d\n",&n,&m);
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
        {
            scanf(" %c ",&lab[i][j]);
            if(lab[i][j] == 'I')
                inceput= (cell){i,j};
            else if(lab[i][j] == 'O')
                sfarsit = (cell){i,j};
            else if(lab[i][j] == 'D')
                q.push((cell){i,j}),mincell[i][j]=1;
        }
    }
    lee2();
    int step,pos;
    costmaxim = _min(_min(costmaxim,mincell[inceput.y][inceput.x]),mincell[sfarsit.y][sfarsit.x]);
    for(step=1;step<=costmaxim;step<<=1);
    for(pos=0;step;step>>=1)
        if(pos+step <= costmaxim && lee(pos+step+1))
            pos+=step;
    printf("%d\n",pos);
}