Pagini recente » Cod sursa (job #2171876) | Cod sursa (job #2241091) | Cod sursa (job #1740003) | Cod sursa (job #2452225) | Cod sursa (job #1076576)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
char ch;
int a[1002][1002],b[1002][1002],d[1002][1002],r,c,x1,y1,x2,y2;
void drum(int i,int j,int mn) {
if (a[i][j]<mn)
mn=a[i][j];
d[i][j]=mn;
if (((a[i+1][j]>0)&&(d[i+1][j]==0))||((a[i+1][j]>d[i+1][j])&&(mn>d[i+1][j])&&(d[i+1][j]>0)))
drum(i+1,j,mn);
if (((a[i][j+1]>0)&&(d[i][j+1]==0))||((a[i][j+1]>d[i][j+1])&&(mn>d[i][j+1])&&(d[i][j+1]>0)))
drum(i,j+1,mn);
if (((a[i-1][j]>0)&&(d[i-1][j]==0))||((a[i-1][j]>d[i-1][j])&&(mn>d[i-1][j])&&(d[i-1][j]>0)))
drum(i-1,j,mn);
if (((a[i][j-1]>0)&&(d[i][j-1]==0))||((a[i][j-1]>d[i][j-1])&&(mn>d[i][j-1])&&(d[i][j-1]>0)))
drum(i,j-1,mn);
}
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);
}
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=0;i<=r+1;i++)
for (int j=0;j<=c+1;j++)
if (b[i][j]==1)
d[i][j]=-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);
drum(x1,y1,2000);
fo<<d[x2][y2];
return 0;
}