Cod sursa(job #2953294)

Utilizator gifiVidru Rares gifi Data 10 decembrie 2022 21:33:17
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n,m,R[1001][1001],D[1001][1001],istart,jstart,ifinish,jfinish,sol,mx=0,r,l,mij;
char c;
queue<pair<int,int> >Q;
bool verificare_dragon(int i1, int j1)
{if (i1>=0 && j1>=0 && j1<m && i1<n && D[i1][j1]==-1) return true;
    return false;
}
bool verificare_loc_sigur(int i1, int j1, int dep)
{if (i1>=0 && j1>=0 && j1<m && i1<n && R[i1][j1]==-1 && D[i1][j1]>=dep) return true;
    return false;
}
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int main()
{cin>>n>>m;
for (int i=0;i<n;i++) for (int j=0;j<m;j++)
    {cin>>c;
    if (c=='I') istart=i,jstart=j;
    if (c=='D') Q.push({i,j}),D[i][j]=0;
        else D[i][j]=-1;
    if (c=='*') R[i][j]=-2,D[i][j]=-2;
    if (c=='O') ifinish=i,jfinish=j;
    }
while (Q.size())
    {int i=Q.front().first,j=Q.front().second;
    for (int k=0;k<=3;k++)
        {if (verificare_dragon(i+dx[k],j+dy[k]))
            {Q.push({i+dx[k], j+dy[k]});
            D[i+dx[k]][j+dy[k]]=D[i][j] + 1;
            mx=max(mx,D[i+dx[k]][j+dy[k]]);
            }
        }
    Q.pop();
    }
r=mx+1;
while (r-l>1)
    {mij=(r+l)/2;
    for (int i=0;i<n;i++) for (int j=0;j<m;j++) if (R[i][j]!=-2) R[i][j]=-1;
    Q.push({istart,jstart});
    R[istart][jstart]=0;
    while (Q.size())
        {int i=Q.front().first,j=Q.front().second;
        for (int k=0;k<=3;k++)
            {if (verificare_loc_sigur(i+dx[k],j+dy[k],mij))
                {Q.push({i+dx[k],j+dy[k]});
                R[i+dx[k]][j+dy[k]]=R[i][j]+1;
                }
            }
        Q.pop();
        }
    if (R[ifinish][jfinish]!=-1)
        {sol=max(sol,mij);
        l=mij;
        }
        else r=mij;
    }
if (D[istart][jstart]<sol) sol=D[istart][jstart];
if (sol!=0) cout<<sol;
else cout<<-1;
    return 0;
}