Pagini recente » Cod sursa (job #2154640) | Cod sursa (job #2143516) | Cod sursa (job #1051760) | Cod sursa (job #2696976) | Cod sursa (job #2390968)
#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;
char A[Dim][Dim];
bool viz[Dim][Dim],done;
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))
if(A[l1][c1]!='D'&&A[l1][c1]!='*')
{
if(viz[l1][c1]==0)
{
qu.push({l1,c1});
D[l1][c1]=D[l][c]+1;
viz[l1][c1]=1;
}
else
if(D[l][c]+1<=D[l1][c1]&&viz[l1][c1]==1)
{
D[l1][c1]=D[l][c]+1;
qu.push({l1,c1});
}
}
}
}
}
void Balanici()
{
qu.push({start.first,start.second});
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++) viz[i][j]=0;
while(!qu.empty())
{
int l=qu.front().first;
int c=qu.front().second;
qu.pop();
viz[l][c]=1;
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))
if(A[l1][c1]!='D'&&A[l1][c1]!='*')
{
if(viz[l1][c1]==0&&D[l1][c1]>=mij)
{
viz[l1][c1]=1;
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=2000;
g<<ans;
return 0;
}