Cod sursa(job #3242569)

Utilizator Stormtrooper-007Vartic Rihard Stormtrooper-007 Data 12 septembrie 2024 17:01:17
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <bits/stdc++.h>

using namespace std;
#define int long long
int dis[1001][1001];
char mat[1001][1001];
int ans[1001][1001];
int diri[4] = {1,0,-1,0};
int dirj[4] = {0,-1,0,1};
vector<pair<int,int>>x;
int n,m;
void LEED()
{
    queue<pair<int,int>>q;
    for(int i=0; i<x.size(); i++)
    {
        q.push({x[i]});
        dis[x[i].first][x[i].second]=1;
    }
    while(!q.empty())
    {
        int a = q.front().first;
        int b = q.front().second;
        q.pop();
        for(int i=0;i<=3;i++)
        {
            int a1 = a+diri[i];
            int b1 = b+dirj[i];
            if(a1<=n && a1>=1 && b1<=m && b1>=1)
            {
                if(!dis[a1][b1] || dis[a1][b1] > dis[a][b]+1)
                {
                    dis[a1][b1] = dis[a][b] + 1;
                    q.push({a1,b1});
                }
            }
        }
    }
}
int fin1,fin2;
int st1,st2;
int LEE2()
{
    int l=0;
    int r=2e9;
    int inr = r;
    while(l<r-1)
    {
        int mid=(l+r)/2;
        cout<<mid<<'\n';
        queue<pair<int,int>>q;
        if(dis[st1][st2] > mid)
        q.push({st1,st2});
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                ans[i][j] = 0;
               // cout<<dis[i][j]<<" ";
            }
            //cout<<'\n';
        }
        ans[st1][st2]=1;
        while(!q.empty())
        {
            int a = q.front().first;
            int b = q.front().second;
            q.pop();
            for(int i=0;i<=3;i++)
            {
                int a1 = a+diri[i];
                int b1 = b+dirj[i];
                if(a1<=n && a1>=1 && b1<=m && b1>=1 && dis[a1][b1] > mid)
                {
                    if(!ans[a1][b1] || ans[a1][b1] > ans[a][b]+1)
                    {
                        ans[a1][b1] = ans[a][b] + 1;
                        q.push({a1,b1});
                    }
                }
            }
        }
        if(ans[fin1][fin2] == 0)
        {
            l=mid;
        }
        else
        {
            r=mid;
        }
    }
    if(r==inr)
    {
        return -1;
    }
    return r-1;
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mat[i][j];
            if(mat[i][j] == 'D')
            x.push_back({i,j});
            if(mat[i][j] == '*')
            dis[i][j] = -1;
            if(mat[i][j] == 'O')
            {
                fin1=i;
                fin2=j;
            }
            if(mat[i][j] == 'I')
            {
                st1=i;
                st2=j;
            }
        }
    }
    LEED();
    cout<<LEE2();
    return 0;
}