Cod sursa(job #2051589)

Utilizator TeoMiliMilitaru Teodora TeoMili Data 29 octombrie 2017 11:59:52
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>
#include <cstring>
using namespace std;
int a[1002][1002],i,j,ip,jp,is,js,n,m,q[2][1000001],b[1002][1002],p,u,st,dr,mid,viz[1001][1001],sol,k;
int dx[]={0,1,0,-1,0};
    int dy[]={0,0,1,0,-1};
char x;
void coadad(){
    int lc,cc,ln,cn,i;

    while(p<=u){
        lc=q[0][p];
        cc=q[1][p];
        p++;
        for(i=1;i<=4;i++){
            ln=lc+dx[i];
            cn=cc+dy[i];
            if(a[ln][cn]==0&&b[ln][cn]==0){
                b[ln][cn]=b[lc][cc]+1;
                u++;
                q[0][u]=ln;
                q[1][u]=cn;
            }
        }
    }
}
int coada(int x,int y,int d){
    int p,u,lc,cc,ln,cn,i;
    int dx[]={0,1,0,-1,0};
    int dy[]={0,0,1,0,-1};
    if(b[x][y]<d)
        return 0;
    p=u=1;
    q[0][p]=x;
    q[1][p]=y;
    memset(viz,0,sizeof(viz));
    viz[x][y]=1;
    while(p<=u && viz[is][js]==0){
        lc=q[0][p];
        cc=q[1][p];
        p++;
        for(i=1;i<=4;i++){
            ln=lc+dx[i];
            cn=cc+dy[i];
            if(a[ln][cn]==0 && b[ln][cn]>=d && viz[ln][cn]==0){
                u++;
                q[0][u]=ln;
                q[1][u]=cn;
                viz[ln][cn]=1;
            }
        }
    }
    return viz[is][js]==1;
}
int main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin>>n>>m;
    //citire
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            cin>>x;
            if(x=='.')
                a[i][j]=0;
            else
                if(x=='*')
                    a[i][j]=2;
                else
                    if(x=='D')
                    a[i][j]=1;
                    else
                        if(x=='I'){
                            ip=i;
                            jp=j;
                        }
                        else
                            if(x=='O'){
                                is=i;
                                js=j;
                            }

        }
    //bordare
  for(j=0;j<=m+1;j++){
    a[0][j]=2;
    a[n+1][j]=2;
  }
  for(i=0;i<=n+1;i++){
    a[i][0]=2;
    a[i][m+1]=2;
  }
  //coada dragoni
  p=1;
  u=0;
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        if(a[i][j]==1){
            u++;
            q[0][u]=i;
            q[1][u]=j;
        }
    coadad();
    //cautare binara
    st=0;
    dr=max(m,n);
    sol=-1;
    while(st<=dr){
        mid=(st+dr)/2;
        k=coada(ip,jp,mid);
        if(k==1){
            sol=mid;
            st=mid+1;
        }
        else
            dr=mid-1;


    }
    if(sol==-1)
        cout<<"0";
    else
        cout<<sol;
    return 0;
}