Mai intai trebuie sa te autentifici.
Cod sursa(job #2390953)
Utilizator | Data | 28 martie 2019 15:59:47 | |
---|---|---|---|
Problema | Barbar | Scor | 50 |
Compilator | cpp-64 | Status | done |
Runda | conccsd | Marime | 2.46 kb |
#include <bits/stdc++.h>
#define Dim 1002
#define MAX 3000
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
bool OK();
int N,M,dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
int D[Dim][Dim],mij,ans=-1;
int Muzeu[Dim][Dim],cnt;
char A[Dim][Dim];
bool viz[Dim][Dim],done=0;
typedef pair<int,int> pii;
pii start;
bool OK(int coordx,int coordy)
{
return (coordx>=1&&coordy>=1&&coordx<=N&&coordy<=M);
}
queue < pii > qu;
void Lee()
{
while(!qu.empty())
{
int l=qu.front().first;
int c=qu.front().second;
viz[l][c]=1;
qu.pop();
for(int i=1;i<=4;i++)
{
int l1=l+dx[i];
int c1=c+dy[i];
if(OK(l1,c1)&&A[l1][c1]!='D'&&A[l1][c1]!='*')
{
if(!viz[l1][c1])
{
qu.push({l1,c1});
D[l1][c1]=D[l][c]+1;
viz[l1][c1]=1;
}
else
if(D[l][c]+1<=D[l1][c1])
{
D[l1][c1]=D[l][c]+1;
qu.push({l1,c1});
}
}
}
}
}
void Balanici()
{
qu.push({start.first,start.second});
cnt++;
while(!qu.empty())
{
int l=qu.front().first;
int c=qu.front().second;
qu.pop();
Muzeu[l][c]=cnt;
if(A[l][c]=='O')
{
done=1;
return;
}
for(int i=1;i<=4;i++)
{
int l1=l+dx[i];
int c1=c+dy[i];
if(OK(l1,c1)&&A[l1][c1]!='D'&&A[l1][c1]!='*')
{
if(Muzeu[l1][c1]!=cnt&&D[l1][c1]>=mij)
{
Muzeu[l1][c1]=cnt;
qu.push({l1,c1});
}
}
}
}
}
int main()
{
f>>N>>M; f.get();
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
f>>A[i][j];
D[i][j]=MAX;
if(A[i][j]=='D')
{
qu.push({i,j});
viz[i][j]=1;
D[i][j]=0;
}
else
if(A[i][j]=='I') start={i,j};
if(j==M) f.get();
}
Lee();
int st=1,dr=D[start.first][start.second];
for(int i=dr;i>=st&&done==0;i--)
{
mij=i;
done=0;
Balanici();
if(done)
ans=mij;
while(!qu.empty()) qu.pop();
}
g<<ans;
return 0;
}