Pagini recente » Cod sursa (job #1565717) | Statistici Bujenita Razvan (Bujenita_Razvan) | Cod sursa (job #691349) | Cod sursa (job #1398577) | Cod sursa (job #1861133)
#include <cstdio>
#include <vector>
#define VMax 1000000
#define NMax 1002
#define oo 1<<30
#define x first
#define y second
using namespace std;
typedef pair<int, int> Per;
vector<Per> q[VMax+1];
Per COADA[VMax+1];
int d[NMax+1][NMax+1];
char is[NMax+1][NMax+1];
char a[NMax+1][NMax+1];
char s[NMax+1];
int dirx[4]={-1,0,1,0};
int diry[4]={0,1,0,-1};
int main(){
FILE* fin = fopen("barbar.in","r");
FILE* fout = fopen("barbar.out","w");
int N,M,i,j,k,x,y,x2,y2,xi,yi,xf,yf,inc,sf,res;
fscanf(fin,"%d %d\n",&N,&M);
for(i = 1; i <= N; ++i)
{
fgets(s,NMax,fin);
for(j = 1; j <= M; ++j) { a[i][j] = s[j-1]; d[i][j] = oo; }
}
for(i = 0; i <= N+1; ++i) a[i][0] = a[i][M+1] = '*';
for(i = 0; i <= M+1; ++i) a[0][i] = a[N+1][i] = '*';
inc = 0; sf = -1;
for(i = 1; i <= N; ++i)
for(j = 1; j <= M; ++j)
if(a[i][j] == 'I') xi = i, yi = j;
else if(a[i][j] == 'O') xf = i, yf = j;
else if(a[i][j] == 'D') COADA[++sf] = {i,j}, d[i][j] = 0;
a[xf][yf] = '.';
while(inc <= sf)
{
x = COADA[inc].x;
y = COADA[inc++].y;
for(k = 0; k < 4; ++k)
{
x2 = x+dirx[k];
y2 = y+diry[k];
if(a[x2][y2] != '*' && d[x2][y2] == oo )
{
d[x2][y2] = d[x][y] + 1;
COADA[++sf] = {x2,y2};
}
}
}
inc = sf = 0;
is[xi][yi] = 1;
res = d[xi][yi]+1;
COADA[0] = {xi,yi};
while(!is[xf][yf] && res)
{
for(--res, i = 0; i < q[res].size(); ++i) COADA[++sf] = q[res][i];
while(inc <= sf)
{
x = COADA[inc].x;
y = COADA[inc++].y;
for(k = 0; k < 4; ++k)
{
x2 = x+dirx[k];
y2 = y+diry[k];
if(!is[x2][y2] && a[x2][y2] == '.')
{
if(d[x2][y2] < res) q[ d[x2][y2] ].push_back({x2,y2});
else{
is[x2][y2] = 1;
COADA[++sf] = {x2,y2};
}
}
}
}
}
if(!is[xf][yf]) fprintf(fout,"-1\n");
else fprintf(fout,"%d\n",res);
return 0;
}