Cod sursa(job #2336515)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 5 februarie 2019 10:44:10
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1},a[1001][1001],b[1001][1001],d[1001][1001];
int q[1000001][2],i,j,n,m,sol,pi,pj,ui,uj,mid,st,dr,u,p;
char ch;
int coada(int x,int y,int v){
    memset(b,0,sizeof(b));
    int p=0,u=0;
    q[p][0]=x;
    q[p][1]=y;
    b[x][y]=1;
    while(p<=u){
        int l=q[p][0];
        int c=q[p][1];
        p++;
        for(int k=1;k<=4;k++){
            int ln=l+dx[k];
            int cn=c+dy[k];
            if(ln>=1&&ln<=n&&cn>=1&&cn<=n)
            if(a[ln][cn]==0&&b[ln][cn]==0&&d[ln][cn]>=v){
                b[ln][cn]=1;
                q[++u][0]=ln;
                q[u][1]=cn;
            }
        }
    }
    return b[ui][uj];
}
int main()
{   f>>n>>m;
    u=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            f>>ch;
            if(ch=='*')
                a[i][j]=1;
            else if(ch=='D'){
                a[i][j]=1;
                q[++u][0]=i;
                q[u][1]=j;
                b[i][j]=1;
            }
            else if(ch=='I'){
                pi=i;
                pj=j;
            }
            else if(ch=='O'){
                ui=i;
                uj=j;
            }
        }
    p=1;
    while(p<=u){
        int l=q[p][0];
        int c=q[p][1];
        p++;
        for(int k=1;k<=4;k++){
            int ln=l+dx[k];
            int cn=c+dy[k];
            if(ln>=1&&ln<=n&&cn>=1&&cn<=m)
            if(a[ln][cn]==0&&b[ln][cn]==0){
                d[ln][cn]=d[l][c]+1;
                b[ln][cn]=1;
                q[++u][0]=ln;
                q[u][1]=cn;
            }
        }
    }
    st=1;dr=n*m;
    sol=-1;
    while(st<=dr){
        mid=(st+dr)/2;
        if(coada(pi,pj,mid)==1){
            sol=mid;
            st=mid+1;
        }
        else
            dr=mid-1;
    }
    g<<sol;
    return 0;
}