Pagini recente » Cod sursa (job #104532) | Cod sursa (job #2918614) | Cod sursa (job #2075421) | Cod sursa (job #8367) | Cod sursa (job #1047233)
#include <iostream>
#include <cstdio>
#include <deque>
#define NMAX 1100
FILE *f,*g;
using namespace std;
bool fin = false;
int A[NMAX][NMAX],B[NMAX][NMAX];
int R,C,xi,yi,xf,yf;
int dl[]={-1,0,1,0};
int dc[]={0,1,0,-1};
deque < int > Qx,Qy,Dx,Dy;
void bordare(int N, int M)
{
for(int i=0 ; i<=N+1 ; i++)
{
A[i][0]=A[i][M+1]=B[i][0]=B[i][M+1]=-1;
}
for(int i=0 ; i<=N+1 ; i++)
{
A[0][i]=A[N+1][i]=B[0][i]=B[N+1][i]=-1;
}
}
void lee_dragoni()
{
int x,y;
while(!Dx.empty())
{
x=Dx.front();
y=Dy.front();
for(int i=0 ; i<4 ; i++)
{
if(A[x+dl[i]][y+dc[i]]==0)
{
if(A[x][y]==-2)
A[x+dl[i]][y+dc[i]]=1;
else
A[x+dl[i]][y+dc[i]]=A[x][y]+1;
Dx.push_back(x+dl[i]);
Dy.push_back(y+dc[i]);
}
}
Dx.pop_front();
Dy.pop_front();
}
}
void lee()
{
Qx.push_front(xi);
Qy.push_front(yi);
if(xi == yi && xf == yf)
fin = true;
while(!Qx.empty())
{
int x,y;
x = Qx.front();
y = Qy.front();
Qx.pop_front();
Qy.pop_front();
for(int k=0 ; k<4 ; k++)
{
if(!B[x + dl[k]][y + dc[k]] && A[x+dl[k]][y+dc[k]]>0)
{
if(x + dl[k] == xf && y + dc[k] == yf)
fin = true;
if(A[x+dl[k]][y+dc[k]]>=B[x][y])
{
B[x+dl[k]][y+dc[k]]=B[x][y];
Qx.push_front(x+dl[k]);
Qy.push_front(y+dc[k]);
}
else
{
B[x+dl[k]][y+dc[k]]=A[x+dl[k]][y+dc[k]];
Qx.push_back(x+dl[k]);
Qy.push_back(y+dc[k]);
}
}
}
}
}
int main()
{
f=fopen("barbar.in","r");
g=fopen("barbar.out","w");
int i,j;
fscanf(f,"%d%d\n",&R,&C);
bordare(R,C);
for(i=1 ; i<=R ; i++)
{
for(j=1 ; j<=C ; j++)
{
char a;
fscanf(f,"%c",&a);
if(a=='*')
{A[i][j]=-1; continue;}
if(a=='.')
{A[i][j]=0; continue;}
if(a=='D')
{
A[i][j]=-2;
Dx.push_back(i);
Dy.push_back(j);
continue;
}
if(a=='I')
{xi=i; yi=j; A[i][j]=0; continue;}
if(a=='O')
{xf=i; yf=j; A[i][j]=0; continue;}
}
fscanf(f,"\n");
}
fclose(f);
lee_dragoni();
B[xi][yi]=A[xi][yi];
lee();
if(fin == true)
fprintf(g,"%d",B[xf][yf]);
else
fprintf(g,"-1");
fclose(g);
return 0;
}