Pagini recente » Cod sursa (job #3149349) | Cod sursa (job #1069565) | Cod sursa (job #3190548) | Cod sursa (job #3290958) | Cod sursa (job #2986397)
#include<cstdio>
#include<deque>
struct pos
{
int i, j;
};
const int NMAX=1024;
char mat[NMAX][NMAX];
int dist[NMAX][NMAX];
int main()
{
FILE *f=fopen("barbar.in", "r"), *g=fopen("barbar.out", "w");
int i, j, N, M, i0, j0, k;
const int di[4]={-1, 1, 0, 0}, dj[4]={0, 0, -1, 1};
std::deque<pos> q;
pos p;
bool ok=1;
fscanf(f, "%d%d", &N, &M);
fgets(mat[0], NMAX, f);
for(i=0;i<N;++i)
{
fgets(mat[i], NMAX, f);
for(j=0;j<M;++j)
{
dist[i][j]=-1;
if(mat[i][j]=='D')
q.push_back({i, j}), dist[i][j]=0;
else if(mat[i][j]=='I')
i0=i, j0=j;
}
}
while(!q.empty())
{
p=q.front();
q.pop_front();
for(k=0;k<4;++k)
{
i=p.i+di[k];
j=p.j+dj[k];
if(i>-1 && i<N && j>-1 && j<M && mat[i][j]!='*' && dist[i][j]==-1)
dist[i][j]=dist[p.i][p.j]+1, q.push_back({i, j});
}
}
q.push_back({i0, j0});
while(!q.empty() && ok)
{
p=q.front();
q.pop_front();
if(mat[p.i][p.j]=='O')
ok=0;
else
for(k=0;k<4;++k)
{
i=p.i+di[k];
j=p.j+dj[k];
if(i>-1 && i<N && j>-1 && j<M && (mat[i][j]=='.' || mat[i][j]=='O'))
{
if(dist[i][j]>=dist[p.i][p.j])
q.push_front({i, j}), dist[i][j]=dist[p.i][p.j];
else
q.push_back({i, j});
if(mat[i][j]!='O')
mat[i][j]='*';
}
}
}
/*for(i=0;i<N;++i)
{
for(j=0;j<M;++j)
printf("%2d ", dist[i][j]);
printf("\n");
}*/
if(ok)
dist[p.i=0][p.j=0]=-1;
fprintf(g, "%d\n", dist[p.i][p.j]);
fclose(f);
fclose(g);
return 0;
}