Cod sursa(job #1000428)

Utilizator andrettiAndretti Naiden andretti Data 22 septembrie 2013 20:34:49
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include<stdio.h>
#include<algorithm>
#include<queue>
#define mp make_pair
#define x first
#define y second
#define maxn 1005
using namespace std;

int n,m,maxx;
int used[maxn][maxn];
int d[maxn][maxn],dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
char s[maxn],a[maxn][maxn];
queue < pair<int,int> > q;
pair<int,int> inp,outp;

void read()
{
    scanf("%d%d\n",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%s\n",s+1);
        for(int j=1;j<=m;j++)
        {
            a[i][j]=s[j];
            if(s[j]=='I') {inp=mp(i,j);continue;}
            if(s[j]=='O') {outp=mp(i,j);continue;}
            if(s[j]=='.') continue;

            if(s[j]=='D') q.push(mp(i,j));
        }
    }
}

void bfs()
{
    int i,j,newi,newj;

    for(;!q.empty();q.pop())
    {
        i=q.front().x; j=q.front().y;
        for(int k=0;k<4;k++)
        {
            newi=i+dx[k]; newj=j+dy[k];
            if(newi<1 || newj<1 || newi>n || newj>m) continue;
            if(a[newi][newj]=='*' || a[newi][newj]=='D' || d[newi][newj]) continue;

            q.push(mp(newi,newj)); d[newi][newj]=d[i][j]+1; maxx=max(maxx,d[newi][newj]);
        }
    }
}

int search(int val)
{
    int i,j,newi,newj;;
    for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
      used[i][j]=0;

    if(d[inp.x][inp.y]<val) return 0;
    while(!q.empty()) q.pop();
    for(q.push(inp),used[inp.x][inp.y]=1;!q.empty();q.pop())
    {
        i=q.front().x; j=q.front().y;
        for(int k=0;k<4;k++)
        {
            newi=i+dx[k]; newj=j+dy[k];
            if(newi<1 || newj<1 || newi>n || newj>m) continue;
            if(a[newi][newj]=='*' || used[newi][newj] || d[newi][newj]<val) continue;

            q.push(mp(newi,newj)); used[newi][newj]=1;
            if(newi==outp.x && newj==outp.y) return 1;
        }
    }
    return 0;
}

void solve()
{
    int i,step;

    maxx++;
    for(step=1;step<maxx;step<<=1);
    for(i=-1;step;step>>=1)
     if(i+step<=maxx && search(i+step))
       i+=step;
    printf("%d",i);
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    read();
    bfs();
    solve();

    fclose(stdin);
    fclose(stdout);
}