Pagini recente » Cod sursa (job #1687707) | Cod sursa (job #1667648) | Cod sursa (job #1895197) | Cod sursa (job #1073172) | Cod sursa (job #1071072)
#include <fstream>
#include <iostream>
#define NMax 1001
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int D[1001][1001], A[1001][1001], X[1000001], Y[1000001];
int N, M, xP, yP, xout, yout, w, x, y, maxD = -1,maxx;
char celula;
int coordx[]={ 0, 1, 0, -1};
int coordy[]={ 1, 0, -1, 0};
void read()
{
in>>N>>M;
int i,j;
for (i=1;i<=N;i++)
for (j=1;j<=M;j++)
{
in>>celula;
D[i][j]=NMax;
if(celula=='*') D[i][j] = 0;
else if(celula=='D')
{
D[i][j]=0;
++w;
X[w]=i;
Y[w]=j;
}
else if(celula=='I')
{
xP = i;
yP = j;
}
else if(celula=='O')
{
xout=i;
yout=j;
}
}
}
void moves()
{
int i,j;
for (j=1;j<=w;j++)
for (i=0,x=X[j],y=Y[j];i<4;i++)
if (D[x + coordx[i]][y + coordy[i]] > D[x][y]+1 && x+coordx[i] >= 1 && x+coordx[i] <= N && y+coordy[i] >= 1 && y+coordy[i] <= M)
{
D[x + coordx[i]][y + coordy[i]] = D[x][y] + 1;
w++;
X[w] = x + coordx[i];
Y[w] = y + coordy[i];
}
}
int check(int mid)
{
if (D[xP][yP]<mid || D[xout][yout]<mid) return 0;
int j;
for (j=w=0,X[j]=xP,Y[j]=yP;j<=w && A[xout][yout]!=mid;j++)
{
x=X[j];
y=Y[j];
int i;
for (i=0;i<4;++i)
if ((x+coordx[i]>=1) && (x+coordx[i]<=N) && (y+coordy[i]>=1) && (y+coordy[i]<=M) && (A[x+coordx[i]][y+coordy[i]]!=mid) && (D[x+coordx[i]][y+coordy[i]] >= mid))
{
w++;
X[w]=x+coordx[i];
Y[w]=y+coordy[i];
A[x+coordx[i]][y+coordy[i]]=mid;
}
}
if (A[xout][yout]==mid) return 1;
return 0;
}
void binary(int st, int dr)
{
int mid=(st+dr)/2;
if(st>dr) return;
else
{
if(!check(mid))
binary(st,mid-1);
else
{
maxD=mid;
binary(mid+1,dr);
}
}
}
int main()
{
read();
moves();
int max=maxx;
if(N>maxx) max=N;
binary(1,max);
out<<maxD;
return 0;
}