Cod sursa(job #827444)

Utilizator ericptsStavarache Petru Eric ericpts Data 2 decembrie 2012 01:22:55
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;


char lab[1005][1005];
unsigned int mincell[1005][1005];
bool viz[1005][1005];
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,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();
        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(!viz[c.y+dy[i]][c.x+dx[i]])
                {
                    mincell[c.y+dy[i]][c.x+dx[i]] = mincell[c.y][c.x] + 1;
                    viz[c.y+dy[i]][c.x+dx[i]]=1;
                    q.push((cell){c.y+dy[i],c.x+dx[i]});
                }

        }
    }
}
bool lee(int cost)
{
    memset(viz,0,sizeof(viz));
    cell c;
    if(mincell[inceput.y][inceput.x] < cost)
        return 0;
    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]] != '*')
                {
                    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;
    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}),viz[i][j]=1;
        }
    }
    lee2();
    int step = (1 << 12) ,pos;
    for(pos=-1;step;step>>=1)
        if(lee(pos+step))
            pos+=step;
    printf("%d\n",pos);
}