Pagini recente » Cod sursa (job #2550574) | Cod sursa (job #1027830)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
char ch;
int a[1001][1001],b[1001][1001],r,c,x1,y1,x2,y2,mxx;
void dragoni(int i,int j,int x,int b[1001][1001]) {
a[i][j]=x;
b[i][j]=1;
if ((a[i+1][j]>a[i][j]+1)||(b[i+1][j]==0))
dragoni(i+1,j,x+1,b);
if ((a[i][j+1]>a[i][j]+1)||(b[i][j+1]==0))
dragoni(i,j+1,x+1,b);
if ((a[i-1][j]>a[i][j]+1)||(b[i-1][j]==0))
dragoni(i-1,j,x+1,b);
if ((a[i][j-1]>a[i][j]+1)||(b[i][j-1]==0))
dragoni(i,j-1,x+1,b);
}
void drum(int i,int j,int mx) {
if (mx>a[i][j])
mx=a[i][j];
if ((b[i+1][j]==0)||((b[i+1][j]==1)&&(mx>a[i+1][j]))) {
b[i+1][j]=1;
drum(i+1,j,mx);
}
if ((b[i][j+1]==0)||((b[i][j+1]==1)&&(mx>a[i][j+1]))) {
b[i][j+1]=1;
drum(i,j+1,mx);
}
if ((b[i-1][j]==0)||((b[i-1][j]==1)&&(mx>a[i-1][j]))) {
b[i-1][j]=1;
drum(i-1,j,mx);
}
if ((b[i][j-1]==0)||((b[i][j-1]==1)&&(mx>a[i][j-1]))) {
b[i][j-1]=1;
drum(i,j-1,mx);
}
if ((i=x2)&&(j=y2))
if (mxx<mx)
mxx=mx;
}
int main()
{
fi>>r>>c;
for (int i=1;i<=r;i++)
for (int j=1;j<=c;j++) {
fi>>ch;
if (ch=='.')
a[i][j]=-2;
else
if (ch=='*') {
a[i][j]=-1;
b[i][j]=1;
}
else
if (ch=='D') {
a[i][j]=0;
b[i][j]=1;
}
else
if (ch=='I') {
x1=i;
y1=j;
a[i][j]=-3;
}
else {
x2=i;
y2=j;
a[i][j]=-4;
}
}
for (int i=1;i<=r;i++)
b[i][0]=1;
for (int i=1;i<=c;i++)
b[0][i]=1;
for (int i=1;i<=r;i++)
b[i][c+1]=1;
for (int i=1;i<=c;i++)
b[r+1][i]=1;
for (int i=1;i<=r;i++)
for (int j=1;j<=c;j++)
if (a[i][j]==0)
dragoni(i,j,0,b);
for (int i=1;i<=r;i++)
for (int j=1;j<=c;j++)
if ((a[i][j]!=0)&&(a[i][j]!=-1))
b[i][j]=0;
drum(x1,y1,2000);
fo<<mxx;
return 0;
}