Cod sursa(job #2537611)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 3 februarie 2020 20:01:39
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <iostream>
#include<fstream>
#include<cstring>
#include<algorithm>
#define N   1005
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

int a[N][N],n,m;
int b[N][N];//pt dist minime
int x1,y1,x2,y2;//pct de plecare
int l[N*N],c[N*N],ult;//pt dragoni

int dl[]={-1,1,0,0};
int dc[]={0,0,1,-1};

void read()
{
    int i,j;
    char x;
    fin>>n>>m;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
        {
            fin>>x;
            if(x=='I')x1=i,y1=j;
            if(x=='O')x2=i,y2=j;
            if(x=='*')a[i][j]=-1;
            if(x=='D')l[++ult]=i,c[ult]=j,a[i][j]=-1,b[i][j]=1;
        }
}

bool inmatrice(int l,int c)
{
    return l>=1&&c>=1&&l<=n&&c<=m;
}

void distante()
{
    int i,j,lin,col,lv,cv,k;
    int pr=1;
    while(pr<=ult)
    {
        lin=l[pr];col=c[pr];pr++;
        for(k=0;k<4;++k)
        {
            lv=lin+dl[k];cv=col+dc[k];
            if(a[lv][cv]==0&&b[lv][cv]==0&&inmatrice(lv,cv))
            {
                b[lv][cv]=b[lin][col]+1;
                l[++ult]=lv;c[ult]=cv;
            }
        }
    }
}

bool posibil(int dist)
{
    //aplicam lee de la x1,y1,la x2,y2
    int pr=1,ult=0;
    int lin,col,k,lv,cv;
    a[x1][y1]=1;

    l[++ult]=x1;c[ult]=y1;
    while(pr<=ult&&a[x2][y2]==0)
    {
        lin=l[pr];col=c[pr];pr++;
        for(k=0;k<4;++k)
        {
            lv=lin+dl[k];cv=col+dc[k];
            if(a[lv][cv]==0&&inmatrice(lv,cv)&&b[lv][cv]>=dist)
            {
                a[lv][cv]=a[lin][col]+1;
                l[++ult]=lv;c[ult]=cv;
            }
        }
    }
    if(a[x2][y2]!=0)return true;
    return false;

}

void reinitializare()
{
    int i,j;
    for(i=1;i<=n;++i)
            for(j=1;j<=m;++j)
                if(a[i][j]!=-1)a[i][j]=0;
}

void solve()
{

    //cautam binar distanta de la 1 la min(n,m)
    int s=1,d=min(n,m);
    int sol;
    while(s<=d)
    {
        int mij=(s+d)/2;
        if(posibil(mij)==true)
        {
            sol=mij;
            s=mij+1;//incercam una mai buna
            reinitializare();
        }
        else
            d=mij-1;
    }
    fout<<sol-1;

}

int main()
{
    int i,j;
    read();
    distante();
    //cout<<x2<<" "<<y2;
    //posibil(1);

    solve();
    /*for(i=1;i<=n;++i)
        {
            for(j=1;j<=m;++j)cout<<a[i][j]<<" ";
            cout<<"\n";
        }*/





    return 0;
}