Pagini recente » Cod sursa (job #2211874) | Cod sursa (job #2267302) | Cod sursa (job #2415214) | Istoria paginii runda/test_12/clasament | Cod sursa (job #895948)
Cod sursa(job #895948)
using namespace std;
#include<iostream>
#include<fstream>
ifstream f("barbar.in");
ofstream g("barbar.out");
int m[1005][1005];
int xu,y,xnou,ynou,r,k,xfinal,yfinal,t,n;
int l[1000001], c[1000001],l2[1000001], c2[1000001];
int dx[]={-1, 0, 1, 0}, dy[]={0, 1, 0, -1};
bool chemare=true;
int lee(int j)
{
k=1; int i,init;
init=m[xfinal][yfinal];
if(chemare==false)
j=-j;
for(i=1; i<=k; i++)
{
xu=l2[i]; y=c2[i];
for(t=0; t<4; t++)
{
xnou = xu+dx[t];
ynou = y+dy[t];
if((m[xnou][ynou]>=j)==chemare)
{
m[xnou][ynou]=-j;
k++;
l2[k]=xnou;
c2[k]=ynou;
}
}
}
chemare=!chemare;
if(init==m[xfinal][yfinal])
return 0;
else
return 1;
}
int search(int st, int dr)
{
int mid=(st+dr)/2;
if(lee(mid))
if(mid==dr)
return mid;
else
return search(mid, dr);
else
if(st==mid)
return mid;
else
return search(st, mid);
}
int main()
{
int i,j;
char a;
f>>n>>r;
for(i=1; i<=n; i++)
for(j=1; j<=r; j++)
{
f>>a;
if(a=='D')
{
m[i][j]=0;
k++;
l[k]=i;
c[k]=j;
}
if(a=='*')
{ ; }
if(a=='.')
{ m[i][j]=-1;}
if(a=='I')
{
l2[1]=i;
c2[1]=j;
}
if(a=='O')
{
xfinal=i;
yfinal=j;
}
}
for(i=1; i<=k; i++)
{
xu=l[i]; y=c[i];
for(t=0; t<4; t++)
{
xnou = xu+dx[t];
ynou = y+dy[t];
if(m[xnou][ynou]==-1)
{
m[xnou][ynou]=m[xu][y]+1;
k++;
l[k]=xnou;
c[k]=ynou;
}
}
}
m[xfinal][yfinal]=1000001;
g<<search(1, 1000000);
}