Cod sursa(job #2051606)

Utilizator Vlad_FuioreaVlad - Stefan Fuiorea Vlad_Fuiorea Data 29 octombrie 2017 12:22:38
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n,m,i,j,a[1001][1001],B[1001][1001],dx[]={0,1,0,-1,0},dy[]={0,0,1,0,-1},x,y,q[2][1000001],p,u,D,viz[1001][1001],xf,yf,xa,ya;
char k;
void coada(){
int l,c,lv,cv,i;
    p=1;
    while(p<=u){
        l=q[0][p];
        c=q[1][p];
        p++;
        for(i=1;i<=4;i++){
            lv=l+dx[i];
            cv=c+dy[i];
           if(a[lv][cv]==0&&B[lv][cv]==0) {
            u++;
            B[lv][cv]=B[l][c]+1;
            q[0][u]=lv;
            q[1][u]=cv;
        }
    }
}
}
int cod(int x,int y,int z){
int p,u,l,c,lv,cv,i;
    if(B[x][y]<z)
        return 0;
    p=u=1;
    memset(viz,0,sizeof(viz));
    q[0][p]=x;
    q[1][p]=y;
    viz[x][y]=1;
    while(p<=u&&viz[xf][yf]==0){
        l=q[0][p];
        c=q[1][p];
        p++;
        for(i=1;i<=4;i++){
            lv=l+dx[i];
            cv=c+dy[i];
            if(a[lv][cv]==0&&viz[lv][cv]==0&&B[lv][cv]>=z)
            {
                u++;
                q[0][u]=lv;
                q[1][u]=cv;
                viz[lv][cv]=1;
            }
        }
    }
    return viz[xf][yf]==1;
}
int main()
{
    cin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            cin>>k;
            if(k=='.')
                a[i][j]=0;
            else
            if(k=='D'){
                a[i][j]=1;
                u++;
                q[0][u]=i;
                q[1][u]=j;
                }
                else
            if(k=='*')
                a[i][j]=2;
                else
            if(k=='I'){
                a[i][j]=0;
                xa=i,ya=j;
                }
                else
            if(k=='O'){
                a[i][j]=0;
                xf=i;
                yf=j;}
    }
    for(i=0;i<=n+1;i++)
        a[i][0]=a[i][m+1]=2;
    for(j=0;j<=m+1;j++)
        a[0][j]=a[n+1][j]=2;
    coada();
    int st=0,dr=max(n,m),sol=-1;
    while(st<=dr){
        int mid=(st+dr)/2;
        D=cod(xa,ya,mid);
        if(D==1)
        {
            sol=mid;
            st=mid+1;
        }
        else
            dr=mid-1;
    }
    cout<<sol;
    return 0;
}