Pagini recente » Cod sursa (job #2277208) | Cod sursa (job #2790244) | Cod sursa (job #1433868) | Cod sursa (job #1900431) | Cod sursa (job #412875)
Cod sursa(job #412875)
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct punct{short int lin,col;};
const short int dl[]={-1,0,1,0};
const short int dc[]={0,1,0,-1};
punct coada[1000000];
int dist[1001][1001],v[1001][1001];
void lee(int u)
{
punct x,y;
int i,p=1;
while (p!=u)
{
x=coada[p++];
for (i=0;i<4;i++)
{
y.lin=x.lin+dl[i];
y.col=x.col+dc[i];
if (dist[y.lin][y.col]>v[x.lin][x.col]+1)
{
coada[u++]=y;
v[y.lin][y.col]=v[x.lin][x.col]+1;
}
}
}
}
void lee_fin(punct x,punct z)
{
punct y;
int i,p=0,u=0,q;
coada[++u]=x;
while (p!=u)
{
x=coada[p++];
for (i=0;i<4;i++)
{
y.lin=x.lin+dl[i];
y.col=x.col+dc[i];
q=max(dist[y.lin][y.col],v[x.lin][x.col]);
if (q>v[y.lin][y.col])
{
v[y.lin][y.col]=q;
if (y.lin!=z.lin || y.col!=z.col) coada[u++]=y;
}
}
}
out<<v[z.lin][z.col];
}
int main()
{
int n,i,u=1,m,j;
char c;
punct x,z;
in>>n>>m;
for (i=0;i<=m+1;i++)
{
v[0][i]=-1;
dist[0][i]=32000;
v[n+1][i]=-1;
dist[n+1][i]=32000;
}
for (i=0;i<=n+1;i++)
{
v[i][0]=-1;
dist[i][m+1]=32000;
dist[i][0]=32000;
v[i][n+1]=-1;
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
in>>c;
switch(c)
{
case '.':;dist[i][j]=32000;break;
case '*':dist[i][j]=-1;break;
case 'D':coada[u++].lin=i;coada[u].col=j;dist[i][j]=0;break;
case 'I':x.lin=i;x.col=j;break;
case '0':z.lin=i;z.col=j;break;
}
}
lee(u);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
v[i][j]=dist[i][j];
lee_fin(x,z);
return 0;
}