Pagini recente » Cod sursa (job #252687) | Cod sursa (job #693184) | Cod sursa (job #2578764) | Cod sursa (job #2672973) | Cod sursa (job #1100321)
#include <fstream>
#include <iostream>
using namespace std;
int r,c,b[1005][1005],lista[1000005][2],marime,indice,folosit[1005][1005],x1,x2,y1,y2,minim[1005][1005];
char a[1005][1005];
void calc (int i,int j)
{
if (a[i][j-1]!='#') if (folosit[i][j-1]==0) { b[i][j-1]=b[i][j]+1; folosit[i][j-1]=1; marime++; lista[marime][0]=i; lista[marime][1]=j-1; }
if (a[i-1][j]!='#') if (folosit[i-1][j]==0) { b[i-1][j]=b[i][j]+1; folosit[i-1][j]=1; marime++; lista[marime][0]=i-1; lista[marime][1]=j; }
if (a[i][j+1]!='#') if (folosit[i][j+1]==0) { b[i][j+1]=b[i][j]+1; folosit[i][j+1]=1; marime++; lista[marime][0]=i; lista[marime][1]=j+1; }
if (a[i+1][j]!='#') if (folosit[i+1][j]==0) { b[i+1][j]=b[i][j]+1; folosit[i+1][j]=1; marime++; lista[marime][0]=i+1; lista[marime][1]=j; }
++indice;
if (indice<=marime) calc(lista[indice][0],lista[indice][1]);
}
void parc (int i,int j,int minima)
{
int minimt=minima;
if (a[i][j-1]!='*') { if (minimt>b[i][j-1]) minimt=b[i][j-1]; if (minim[i][j-1]==-1 || minim[i][j-1]<minimt) { minim[i][j-1]=minimt; parc(i,j-1,minimt); } }
minimt=minima;
if (a[i-1][j]!='*') { if (minimt>b[i-1][j]) minimt=b[i-1][j]; if (minim[i-1][j]==-1 || minim[i-1][j]<minimt) { minim[i-1][j]=minimt; parc(i-1,j,minimt); } }
minimt=minima;
if (a[i][j+1]!='*') { if (minimt>b[i][j+1]) minimt=b[i][j+1]; if (minim[i][j+1]==-1 || minim[i][j+1]<minimt) { minim[i][j+1]=minimt; parc(i,j+1,minimt); } }
minimt=minima;
if (a[i+1][j]!='*') { if (minimt>b[i+1][j]) minimt=b[i+1][j]; if (minim[i+1][j]==-1 || minim[i+1][j]<minimt) { minim[i+1][j]=minimt; parc(i+1,j,minimt); } }
}
int main ()
{
ifstream in ("barbar.in");
ofstream out ("barbar.out");
in>>r>>c;
//initializare
for (int i=1;i<=r;++i) { a[i][0]='#'; a[i][c+1]='#'; }
for (int i=1;i<=c;++i) { a[0][i]='#'; a[r+1][i]='#'; }
for (int i=1;i<=r;++i)
{
for (int j=1;j<=c;++j)
{
in>>a[i][j];
}
}
marime=0;
for (int i=1;i<=r;++i)
{
for (int j=1;j<=c;++j)
{
if (a[i][j]=='D') { marime++; lista[marime][0]=i; lista[marime][1]=j; folosit[i][j]=1; }
if (a[i][j]=='I') { x1=i; y1=j; }
if (a[i][j]=='O') { x2=i; y2=j; }
}
}
indice=1;
calc(lista[indice][0],lista[indice][1]);
for (int i=1;i<=r;++i) { a[i][0]='*'; a[i][c+1]='*'; }
for (int i=1;i<=c;++i) { a[0][i]='*'; a[r+1][i]='*'; }
for (int i=1;i<=r;++i)
{
for (int j=1;j<=c;++j)
{
minim[i][j]=-1;
}
}
minim[x1][y1]=b[x1][y1];
parc(x1,y1,b[x1][y1]);
out<<minim[x2][y2];
in.close();
out.close();
}