Cod sursa(job #3263134)

Utilizator tedicTheodor Ciobanu tedic Data 13 decembrie 2024 15:08:28
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <fstream>
#include <queue>

using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
queue<pair<int,int>>q;
char v[1005][1005];
int dist[1005][1005];bool parcurs[1005][1005];
int n,m, inceputi=0, inceputj=0;
void dragon()
{
    while(!q.empty())
    {
        int x=q.front().first, y=q.front().second;
        q.pop();
        if(x-1>0 && dist[x-1][y]==-1)
        {
            dist[x-1][y]=dist[x][y]+1;
            q.push({x-1,y});
        }
        if(x+1<=n && dist[x+1][y]==-1)
        {
            dist[x+1][y]=dist[x][y]+1;
            q.push({x+1,y});
        }
        if(y-1>0 && dist[x][y-1]==-1)
        {
            dist[x][y-1]=dist[x][y]+1;
            q.push({x,y-1});
        }
        if(y+1<=m && dist[x][y+1]==-1)
        {
            dist[x][y+1]=dist[x][y]+1;
            q.push({x,y+1});
        }
    }
}
bool verif(int l)
{
    while(!q.empty())
        q.pop();
    q.push({inceputi,inceputj});
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            parcurs[i][j]=0;
    while(!q.empty())
    {
        int x=q.front().first, y=q.front().second;
        q.pop();
        parcurs[x][y]=1;
        if(v[x][y]=='O')
            return 1;
        if(x-1>0 && !parcurs[x-1][y] && dist[x-1][y]>=l)
        {
            parcurs[x-1][y]=1;
            q.push({x-1,y});
        }
        if(x+1<=n && !parcurs[x+1][y] && dist[x+1][y]>=l)
        {
            parcurs[x+1][y]=1;
            q.push({x+1,y});
        }
        if(y-1>0 && !parcurs[x][y-1] && dist[x][y-1]>=l)
        {
            parcurs[x][y-1]=1;
            q.push({x,y-1});
        }
        if(y+1<=m && !parcurs[x][y+1] && dist[x][y+1]>=l)
        {
            parcurs[x][y+1]=1;
            q.push({x,y+1});
        }
    }
    return 0;
}
int cautbin()
{
    int st=0, dr=1000000,bun=-1;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        if(verif(mid))
            bun=mid, st=mid+1;
        else
            dr=mid-1;
    }
    return bun;
}
int main()
{
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            cin>>v[i][j];
            if(v[i][j]=='I')
                inceputi=i, inceputj=j;
        }
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            if(v[i][j]=='D')
                q.push({i,j});
            else if(v[i][j]=='*')
                dist[i][j]=-2;
            else
                dist[i][j]=-1;
        }
    }
    dragon();
    cout<<cautbin();
    return 0;
}