Pagini recente » Cod sursa (job #1782457) | Cod sursa (job #2829282) | Rating Ratiu Ioan (ratiu) | Cod sursa (job #2443246) | Cod sursa (job #2712769)
#include <iostream>
#include <fstream>
#include<queue>
using namespace std;
int dragoni[1000][1000],mat[1000][1000];
int matrice[1000][1000];
int n,m,x_final,y_final;
struct Nod
{
int x;
int y;
};
queue<Nod>q;
void bordare()
{
for(int i=0;i<=n+1;i++)
{
mat[i][0]=-1;
mat[i][m+1]=-1;
dragoni[i][0]=-1;
dragoni[i][m+1]=-1;
}
for(int j=0;j<=m+1;j++)
{
mat[0][j]=-1;
mat[n+1][j]=-1;
dragoni[0][j]=-1;
dragoni[n+1][j]=-1;
}
}
bool verif(int dist)
{
while(!q.empty())
q.pop();
for(int i=0; i<=n+1; i++)
{
for(int j=0; j<=m+1; j++)
{
if(mat[i][j]==1)
{
Nod nn;
nn.x=i;
nn.y=j;
q.push(nn);
}
matrice[i][j]=mat[i][j];
}
}
while(!q.empty())
{
Nod nod=q.front();
Nod adaugare;
q.pop();
if(nod.x==x_final && nod.y == y_final)
{
return 1;
}
if(matrice[nod.x+1][nod.y]==0 && dragoni[nod.x+1][nod.y]>=dist)
{
matrice[nod.x+1][nod.y]=matrice[nod.x][nod.y]+1;
adaugare.x=nod.x+1;
adaugare.y=nod.y;
q.push(adaugare);
}
if(matrice[nod.x-1][nod.y]==0 && dragoni[nod.x-1][nod.y]>=dist)
{
matrice[nod.x-1][nod.y]=matrice[nod.x][nod.y]+1;
adaugare.x=nod.x-1;
adaugare.y=nod.y;
q.push(adaugare);
}
if(matrice[nod.x][nod.y+1]==0 && dragoni[nod.x][nod.y+1]>=dist)
{
matrice[nod.x][nod.y+1]=matrice[nod.x][nod.y]+1;
adaugare.x=nod.x;
adaugare.y=nod.y+1;
q.push(adaugare);
}
if(matrice[nod.x][nod.y-1]==0 && dragoni[nod.x][nod.y-1]>=dist)
{
matrice[nod.x][nod.y-1]=matrice[nod.x][nod.y]+1;
adaugare.x=nod.x;
adaugare.y=nod.y-1;
q.push(adaugare);
}
}
return 0;
}
int cb()
{
int st=0;
int dr=min(n,m);
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(verif(mij+1))
{
st=mij+1;
}
else
{
dr=mij-1;
}
}
return dr;
}
int lee()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(dragoni[i][j]==1)
{
Nod nn;
nn.x=i;
nn.y=j;
q.push(nn);
}
}
}
while(!q.empty())
{
Nod nod=q.front();
Nod adaugare;
q.pop();
if(dragoni[nod.x+1][nod.y]==0)
{
dragoni[nod.x+1][nod.y]=dragoni[nod.x][nod.y]+1;
adaugare.x=nod.x+1;
adaugare.y=nod.y;
q.push(adaugare);
}
if(dragoni[nod.x-1][nod.y]==0)
{
dragoni[nod.x-1][nod.y]=dragoni[nod.x][nod.y]+1;
adaugare.x=nod.x-1;
adaugare.y=nod.y;
q.push(adaugare);
}
if(dragoni[nod.x][nod.y+1]==0)
{
dragoni[nod.x][nod.y+1]=dragoni[nod.x][nod.y]+1;
adaugare.x=nod.x;
adaugare.y=nod.y+1;
q.push(adaugare);
}
if(dragoni[nod.x][nod.y-1]==0)
{
dragoni[nod.x][nod.y-1]=dragoni[nod.x][nod.y]+1;
adaugare.x=nod.x;
adaugare.y=nod.y-1;
q.push(adaugare);
}
}
}
int main()
{
ifstream in("barbar.in");
ofstream out("barbar.out");
char c;
in>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<m; j++)
{
in>>c;
if(c=='D')
{
dragoni[i][j]=1;
mat[i][j]=-1;
}
else if(c=='*')
{
dragoni[i][j]=-1;
mat[i][j]=-1;
}
else if(c=='O')
{
x_final=i;
y_final=j;
}
else if(c=='I')
{
mat[i][j]=1;
}
}
}
bordare();
lee();
out<<cb();
return 0;
}