Pagini recente » Cod sursa (job #1918614) | Cod sursa (job #73285) | Cod sursa (job #326061) | Cod sursa (job #1852267) | Cod sursa (job #2097697)
#include <iostream>
#include <fstream>
#include <limits.h>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m, a[1001][1001], i1,j1,i2,j2, a1[1001][1001];
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[m+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;
}
int main()
{
int i,ii,jj,k,j,ok=0,sol=0;
citire();
bordare();
lee();
//afis();
int st=1, dr=max(m,n), mij;
while(st<=dr)
{
mij=st+(dr-st)/2;
if(mij>a[i1][j1])
{
dr=mij-1; continue;//
}
else
{
ok=0;
while(!c1.empty()) {c1.pop(); c2.pop();}//
a1[i1][j1]=mij; //afis(); cout<<endl;
c1.push(i1); c2.push(j1);
while(!c1.empty() && ok==0)
{
i=c1.front(); j=c2.front();
c1.pop(); c2.pop();
for(k=0; k<4; k++)
{
ii=i+dx[k]; jj=j+dy[k];
if(a1[ii][jj]!=-1)
if(mij<=a[ii][jj] && a1[ii][jj]!=mij)
{
c1.push(ii); c2.push(jj);
a1[ii][jj]=mij;
if(ii==i2 && jj==j2)
{ok=1;}
}
}
}
}
if(ok)
{st=mij+1; sol=1;}
else
dr=mij-1;
}
if(sol) g<<dr-1;
else g<<-1;
f.close();
g.close();
return 0;
}