Pagini recente » Cod sursa (job #2767363) | Cod sursa (job #1322096) | Cod sursa (job #1563130) | Cod sursa (job #1099099) | Cod sursa (job #1453381)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
struct poz{
int c,r;
};
struct poz dragon[1000020],pornire,oprire;
long int t[1005][1005],v[1000020][5],x,y;
long int R,C,nr_drag,i,j,pasi,gasit;
char ch;
long int cauta(int r,int c){
int d;
d=fabs(r-dragon[0].r)+fabs(c-dragon[0].c);
for(int i=1;i<nr_drag;i++)
{
if(fabs(r-dragon[i].r)+fabs(c-dragon[i].c)<d)
d=fabs(r-dragon[i].r)+fabs(c-dragon[i].c);
}
return d;
}
int main()
{
f>>R>>C;
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
f>>ch;
if(ch=='.')
t[i][j]=0;
else if (ch=='*')
t[i][j]=-1;
else if(ch=='D'){
t[i][j]=-2;
dragon[nr_drag].c=j;
dragon[nr_drag].r=i;
nr_drag++;
}
else if(ch=='I'){
pornire.c=j;
pornire.r=i;
t[i][j]=-3;
}
else if(ch=='O')
t[i][j]=-4;
oprire.r=i;
oprire.c=j;
}
}
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
t[-1][j]=-1;
t[R][j]=-1;
t[i][-1]=-1;
t[i][C]=-1;
}
}
i=pornire.r;
j=pornire.c;
pasi=0;
t[i][j]=cauta(i,j);
x=0;y=0;
while(!gasit){
if(i==oprire.r && j==oprire.c){
gasit=1;
}else{
if(t[i+1][j]>0){
t[i+1][j]=max(t[i][j],t[i+1][j]);
}
else if(t[i+1][j]==0 || t[i+1][j]==-4 ){
t[i+1][j]=min(t[i][j],cauta(i+1,j));
v[y][0]=i+1;
v[y][1]=j;
y++;
}
if(t[i-1][j]>0){
t[i-1][j]=max(t[i][j],t[i-1][j]);
}
else if(t[i-1][j]==0 || t[i-1][j]==-4){
t[i-1][j]=min(t[i][j],cauta(i-1,j));
v[y][0]=i-1;
v[y][1]=j;
y++;
}
if(t[i][j+1]>0){
t[i][j+1]=max(t[i][j],t[i][j+1]);
}
else if(t[i][j+1]==0 || t[i][j+1]==-4){
t[i][j+1]=min(t[i][j],cauta(i,j+1));
v[y][0]=i;
v[y][1]=j+1;
y++;
}
if(t[i][j-1]>0){
t[i][j-1]=max(t[i][j],t[i][j-1]);
}
else if(t[i][j-1]==0 || t[i][j-1]==-4){
t[i][j-1]=min(t[i][j],cauta(i,j-1));
v[y][0]=i;
v[y][1]=j-1;
y++;
}
i=v[x][0];
j=v[x][1];
x++;
}
}
g<<t[oprire.r][oprire.c];
return 0;
}