Pagini recente » Cod sursa (job #2481477) | Cod sursa (job #2452815) | Cod sursa (job #38174) | Cod sursa (job #276760) | Cod sursa (job #1226659)
#include <cstdio>
#include <climits>
#include <conio.h>
void citeste();
struct pozitie{int x,y;};
void genereaza(int,int);
bool vizitat[1000][1000];
int mat[1001][1001];
int unda[1001][1001];
int n,m;
pozitie inceput;
pozitie sfarsit;
bool cautadrum(int dist, pozitie a, pozitie b)
{
if(a.x == b.x && a.y == b.y)
return true;
vizitat[a.x][a.y] = true;
a.x++;
if(a.x<n)
if(unda[a.x][a.y] == dist)
if(mat[a.x][a.y] != 1)
if(!vizitat[a.x][a.y])
cautadrum(dist,a,b);
a.x--;
a.y++;
if(a.x<n)
if(unda[a.x][a.y] == dist)
if(mat[a.x][a.y] != 1)
if(!vizitat[a.x][a.y])
cautadrum(dist,a,b);
a.y--;
a.x--;
if(a.x<n)
if(unda[a.x][a.y] == dist)
if(mat[a.x][a.y] != 1)
if(!vizitat[a.x][a.y])
cautadrum(dist,a,b);
a.x++;
a.y--;
if(a.x<n)
if(unda[a.x][a.y] == dist)
if(mat[a.x][a.y] != 1)
if(!vizitat[a.x][a.y])
cautadrum(dist,a,b);
a.y++;
a.x++;
a.y++;
if(a.x<n)
if(unda[a.x][a.y] == dist)
if(mat[a.x][a.y] != 1)
if(!vizitat[a.x][a.y])
cautadrum(dist,a,b);
a.y--;
a.x--;
a.x++;
a.y--;
if(a.x<n)
if(unda[a.x][a.y] == dist)
if(mat[a.x][a.y] != 1)
if(!vizitat[a.x][a.y])
cautadrum(dist,a,b);
a.y++;
a.x--;
a.x--;
a.y++;
if(a.x<n)
if(unda[a.x][a.y] == dist)
if(mat[a.x][a.y] != 1)
if(!vizitat[a.x][a.y])
cautadrum(dist,a,b);
a.y--;
a.x++;
a.x--;
a.y--;
if(a.x<n)
if(unda[a.x][a.y] == dist)
if(mat[a.x][a.y] != 1)
if(!vizitat[a.x][a.y])
cautadrum(dist,a,b);
a.y++;
a.x++;
vizitat[a.x][a.y] = false;
}
int max = -INT_MAX;
int main()
{
citeste();
/* for(int i=0; i<n; i++)
{
for(int j =0; j<m; j++)
printf("%d ",unda[i][j]);
printf("\n");
}
printf("\n\n");*/
freopen("barbar.out","w",stdout);
max = (unda[inceput.x][inceput.y]>unda[sfarsit.x][sfarsit.y])?unda[sfarsit.x][sfarsit.y]:unda[inceput.x][inceput.y];
for(int i = max; i>=1; i--)
if(cautadrum(i,inceput, sfarsit))
{
printf("%d ",i);
return 0 ;
}
printf("%d",-1);
}
void citeste()
{
freopen("barbar.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)
for(int j =0; j<m; j++)
unda[i][j] = INT_MAX;
char x;
for(int i =0; i<n; i++)
for(int j =0; j<m; j++)
{
scanf("%c",&x);
switch(x)
{
case '.':{mat[i][j] = 0;break;}
case '*':{mat[i][j] = 1; inceput.x = i; inceput.y= j;break;}
case 'D':{mat[i][j] = 2; unda[i][j] = 0;genereaza(i,j);break;}
case '0':{mat[i][j] = 3; sfarsit.x = i; sfarsit.y= j;break;}
default:mat[i][j] = 4;
}
}
fclose(stdin);
}
void genereaza(int x, int y)
{
bool mod = false;
int distanta = 1;
do
{
mod = false;
for(int i =x-distanta; i<=x+distanta;i++)
for(int j = y-distanta; j<=y+distanta;j++)
if(!(x == i && y ==j) && unda[i][j]>distanta && i<n && i>=0 && j<m && j>=0)
{
mod = true;
unda[i][j] = distanta;
}
distanta++;
}
while(mod);
/* for(int i =0; i<n; i++)
{
for(int j =0; j<m; j++)
if(unda[i][j]!=INT_MAX)
printf("%d ",unda[i][j]);
else
printf("0 ");
printf("\n");
}
printf("\n");
getch();*/
}