Pagini recente » Cod sursa (job #1332085) | Arhiva de probleme | Cod sursa (job #1840418) | Cod sursa (job #2572949) | Cod sursa (job #218544)
Cod sursa(job #218544)
#include<stdio.h>
struct coord {
int x,y;
};
char c;
int a[1005][1005];
int DistMin[1005][1005];
int contor;
int i;
int j;
int k;
char x;
char viz[1005][1005];
coord SirDragon[4000010],start,finish;
const int dx[10] = {0,-1,0,1,0};
const int dy[10] = {0,0,1,0,-1};
int nl;
int nc;
int Gasim(int u)
{
int cap = 1;
int i,j;
int coada = 1;
for(i=1;i<=nl;i++)
for(j=1;j<=nc;j++)
viz[i][j] = 0;
SirDragon[cap] = start;
if (DistMin[SirDragon[cap].x][SirDragon[cap].y] < u) return 0;
viz[SirDragon[cap].x][SirDragon[cap].y] = 1;
while (cap<=coada)
{
for(i=1;i<=4;i++)
if (!viz[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]])
if (DistMin[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] >=u)
{
viz[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] = 1;
SirDragon[++coada].x = SirDragon[cap].x + dx[i];
SirDragon[coada].y = SirDragon[cap].y + dy[i] ;
if (SirDragon[coada].x == finish.x && SirDragon[coada].y== finish.y) return 1;
}
cap++;
}
return 0;
}
int Lee()
{
int cap = 1;
int i;
int coada = contor;
while (cap<=coada)
{
int cnstant = DistMin[SirDragon[cap].x][SirDragon[cap].y];
for(i=1;i<=4;i++)
if (a[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] == 1)
if (DistMin[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] > cnstant+1)
{
DistMin[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] = cnstant+1;
SirDragon[++coada].x = SirDragon[cap].x + dx[i];
SirDragon[coada].y = SirDragon[cap].y + dy[i] ;
}
cap++;
}
return 0;
}
int BinSearch(int ls,int ld)
{
int mij;
while (ld-ls>1)
{
mij = (ls+ld)>>1;
if (Gasim(mij)) ls = mij;
else ld = mij;
}
if (Gasim(ld)) return ld;
else return ls;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d",&nl,&nc);
for(i=1;i<=nl;i++)
for(j=1;j<=nc;j++)
{
scanf("%c",&x);
DistMin[i][j]=1000005;
if (x == 10) j--;
if (x == '.') a[i][j] = 1;
if (x == '*') {DistMin[i][j] = -1 ; a[i][j] = -1;}
if (x == 'D')
{
DistMin[i][j] = 0;
a[i][j] = 1;
SirDragon[++contor].x = i;
SirDragon[contor].y = j;
}
if (x == 'I')
{
a[i][j] = 1;
start.x = i;
start.y = j;
}
if (x == 'O')
{
a[i][j] = 1;
finish.x = i;
finish.y = j;
}
}
Lee();
for(i=0;i<=nc+1;i++)
{
DistMin[0][i] = -5;
DistMin[nl+1][i] = -5;
}
for(i=0;i<=nl+1;i++)
{
DistMin[i][0] = -5;
DistMin[i][nc+1] = -5;
}
int answ = BinSearch(-1,nl*nc+1);
printf("%d",answ);
return 0;
}