Pagini recente » Cod sursa (job #2539227) | Cod sursa (job #1916214) | Cod sursa (job #400479) | Cod sursa (job #2126733) | Cod sursa (job #399199)
Cod sursa(job #399199)
#include<fstream.h>
#include<queue>
#include<string.h>
#define min(a,b) a<b?a:b
using namespace std;
queue<int> X,Y;
int d[ 1002 ][ 1002 ],D[ 1002 ][ 1002 ],xi,yi,xf,yf,i,j,k,l,m,n,A,b,p,x,y,x2,y2;
int dx[] = {0,0,1,0,-1},dy[] = {0,1,0,-1,0};
int viz[ 1002 ][ 1002];
char a;
ifstream f("barbar.in");
ofstream g("barbar.out");
int main(){
f>>n>>m;
memset(D,1000,sizeof(D));
for(i = 1; i <= n ; i++)
for(j = 1; j <= m ; j++)
{f>>a;
if(a == '*')
{d[i][j] = 1 << 30;
viz[i][j] = 1;
D[i][j] = 1<<30;
}
else
if(a == 'D'){
X.push(i);
Y.push(j);
p++;
viz[i][j] = 1;
}
if(a == 'I')
xi = i,yi = j;
else
if(a == 'O')
xf = i,yf = j;
}
// calc drum minim
while(p)
{x = X.front();
y = Y.front();
for(i = 1 ; i <= 4 ; i++)
{x2 = x + dx[i];
y2 = y + dy[i];
if(!viz[x2][y2] && 1 <= x2 && x2 <= n && 1 <= y2 && y2 <= m && !viz[x2][y2])
{d[x2][y2] = d[x][y] + 1;
viz[x2][y2] = 1;
X.push(x2);
Y.push(y2);
p++;
}
}
X.pop();
Y.pop();
p--;
}
memset(viz,0,sizeof(viz));
X.push(xi);
Y.push(yi);
p++;
D[xi][yi] = d[xi][yi];
viz[xi][yi] = 1;
D[xf][yf] = -1;
while(p)
{x = X.front();
y = Y.front();
for(i = 1 ; i <= 4 ; i++)
{x2 = x + dx[i];
y2 = y + dy[i];
A = min(D[x][y],d[x2][y2]);
if(A > D[x2][y2] && 1<= x2 && x2 <= n && 1<= y2 && y2 <= m)
{D[x2][y2] = A;
if(!viz[x2][y2])
{viz[x2][y2] = 1;
p++;
X.push(x2);
Y.push(y2);
}
}
}
X.pop();
Y.pop();
p--;
viz[x][y] = 0;
}
g<<D[xf][yf];
return 0;}