Pagini recente » Cod sursa (job #1505257) | Cod sursa (job #442970) | Cod sursa (job #835781) | Cod sursa (job #2877508) | Cod sursa (job #894059)
Cod sursa(job #894059)
#include <fstream>
#include <queue>
using namespace std;
#define NMAX 1005
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,v[NMAX][NMAX],d[NMAX][NMAX],drum[NMAX][NMAX],x1,x2,y1,y2;
queue <int> qx,qy,qval;
int viz[NMAX][NMAX],verif;
void read()
{
fin>>n>>m;
char k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
fin>>k;
if(k == '*')
{
v[i][j] = 1;
continue;
}
if(k == 'I')
{
x1=i;
y1=j;
v[i][j] = -1;
continue;
}
if(k == 'D')
{
v[i][j] = 2;
qx.push(i);
qy.push(j);
qval.push(0);
viz[i][j] = 1;
continue;
}
if(k == 'O')
{
v[i][j] = -2;
x2=i;
y2=j;
}
}
}
}
void tipar()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
fout<<drum[i][j]<<" ";
fout<<"\n";
}
}
void baga(int x,int y,int pas)
{
if(x>n || y>m) return;
if(!x || !y) return;
if(viz[x][y] == verif) return;
viz[x][y] = verif;
qx.push(x);
qy.push(y);
qval.push(pas);
d[x][y] = pas;
}
void bfs_dragoni()
{
int x,y,pas;
verif = 1;
while(!qx.empty())
{
x=qx.front();
y=qy.front();
pas=qval.front() + 1;
qx.pop();
qy.pop();
qval.pop();
baga(x+1,y,pas);
baga(x-1,y,pas);
baga(x,y+1,pas);
baga(x,y-1,pas);
}
}
int minim(int a,int b)
{
if(a>b) return b;
return a;
}
void baga2(int x,int y,int pas)
{
if(x==0 || y==0) return;
if(x>n || y>m) return;
if(viz[x][y] == verif && pas <= drum[x][y]) return;
viz[x][y] = verif;
drum[x][y] = minim ( pas , d[x][y] );
qx.push(x);
qy.push(y);
qval.push(drum[x][y]);
}
void bfs_drum()
{
int x,y,pas;
qx.push(x1);
qy.push(y1);
viz[x1][y1] = 2;
drum[x1][y1] = d[x1][y1];
qval.push(d[x1][y1]);
verif = 2;
while(!qx.empty())
{
x=qx.front();
y=qy.front();
pas=qval.front();
qx.pop();
qy.pop();
qval.pop();
baga2(x+1,y,pas);
baga2(x-1,y,pas);
baga2(x,y+1,pas);
baga2(x,y-1,pas);
}
}
int main()
{
read();
bfs_dragoni();
bfs_drum();
//tipar();
if(viz[x2][y2] != verif)
fout<<-1;
else
fout<<drum[x2][y2];
}