Pagini recente » Cod sursa (job #1707964) | Cod sursa (job #158714) | Cod sursa (job #1378596) | Cod sursa (job #330418) | Cod sursa (job #2097706)
#include <iostream>
#include <fstream>
#include <limits.h>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m, a[1005][1005], i1,j1,i2,j2, a1[1005][1005];
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
queue<int> c1,c2;
void bordare()
{
int i,j;
for(i=0; i<=n+1; i++)
{a[i][0]=-1; a[i][m+1]=-1; a1[i][0]=-1; a1[i][m+1]=-1;}
for(j=1; j<=m+1; j++)
{a[0][j]=-1; a[n+1][j]=-1; a1[0][j]=-1; a1[m+1][j]=-1;}
}
void citire()
{
char c;
int i,j;
f>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
f>>c;
if(c=='*')
a[i][j]=-1;//perete
if(c=='D')//dragon
{a[i][j]=1; c1.push(i); c2.push(j);}
if(c=='I')
{i1=i; j1=j;}
if(c=='O')
{i2=i; j2=j;}
}
}
void lee()
{
int ii,jj,i,j,k,pas;
while(!c1.empty())
{
i=c1.front(); j=c2.front();
c1.pop(); c2.pop();
pas=a[i][j];
for(k=0; k<4; k++)
{
ii=i+dx[k]; jj=j+dy[k];
if(a[ii][jj]==0)
{
c1.push(ii); c2.push(jj);
a[ii][jj]=pas+1;
}
}
}
}
void afis()
{
int i,j;
for(i=1; i<=n; i++)
{for(j=1; j<=m; j++)
cout<<a1[i][j]<<" ";
cout<<endl;}cout<<endl;
}
void filla(int x, int y, int pas)
{
if(x==i2 && y==j2)
{
a1[x][y]=pas;
//afis();
}
else
{
if(a[x][y]>1)
if(pas<=a[x][y] && a1[x][y]!=pas)
{a1[x][y]=pas;
filla(x,y+1,pas);
filla(x+1,y,pas);
filla(x-1,y,pas);
filla(x,y-1,pas);
}
}
}
int main()
{
int i,ok=0,p;
citire();
bordare();
lee();
//afis();
p=max(n,m);
for(i=2*p; i>=2; i--)
{
filla(i1,j1,i);
if(a1[i2][j2]==i)
{
g<<i-1; ok=1; break;
}
}
if(!ok) g<<-1;
f.close();
g.close();
return 0;
}