Pagini recente » Cod sursa (job #452473) | Cod sursa (job #368229) | Cod sursa (job #1558176) | Cod sursa (job #2156521) | Cod sursa (job #2375828)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,i,j;
int startx,starty,endx,endy;
int Map[1005][1005];
int verif[1005][1005];
int dp[1005][1005];
int ok=1;
int nr=-4;
int rez=0;
struct axis
{
int x,y;
};
queue <axis> coada;
axis lg;
int dx[]={0,1,-1,0};
int dy[]={1,0,0,-1};
bool conditie(int l,int c)
{
if(Map[l][c]==-1)
return 0;
if(l<1 || l>n || c<1 || c>m)
return 0;
if(verif[l][c]==1)
return 0;
return 1;
}
bool cond(int l,int c,int val,int nr)
{
if(l<1 || l>n || c<1 || c>m)
return 0;
if(Map[l][c]==-1)
return 0;
if(dp[l][c]<val)
return 0;
if(Map[l][c]==nr)
return 0;
return 1;
}
void Lee()
{
int cx,cy,nx,ny;
while(!coada.empty())
{
cx=coada.front().x;
cy=coada.front().y;
coada.pop();
for(int k=0;k<4;k++)
{
// fout<<2;
nx=cx+dx[k];
ny=cy+dy[k];
if(conditie(nx,ny))
{
dp[nx][ny]=dp[cx][cy]+1;
lg.x=nx;
lg.y=ny;
coada.push(lg);
verif[nx][ny]=1;
}
}
//verif[cx][cy]=1;
}
}
void Citire()
{
fin>>n>>m;
fin.get();
char c;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
fin>>c;
// cout<<c;
if(c=='*')
Map[i][j]=-1;
if(c=='D')
{
lg.x=i;
lg.y=j;
coada.push(lg);
verif[i][j]=1;
// fout<<1;
}
if(c=='O')
{
endx=i;
endy=j;
}
if(c=='I')
{
startx=i;
starty=j;
}
}
}
int path_finder(int val,int nr)
{
int cx,cy,nx,ny;
lg.x=startx;
lg.y=starty;
coada.push(lg);
while(!coada.empty())
{
cx=coada.front().x;
cy=coada.front().y;
coada.pop();
for(int k=0;k<4;k++)
{
nx=cx+dx[k];
ny=cy+dy[k];
if(nx==endx && ny==endy && dp[nx][ny]>=val)
return 1;
if(cond(nx,ny,val,nr))
{
lg.x=nx;
lg.y=ny;
coada.push(lg);
}
}
Map[cx][cy]=nr;
}
return 0;
}
int bs(int left,int right)
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(path_finder(mid,nr))
{
//fout<<mid<<" ";
rez=mid;
left=mid+1;
while(!coada.empty())
coada.pop();
}
else
right=mid-1;
nr--;
}
return rez;
}
void Afiasre()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
fout<<dp[i][j]<<" ";
fout<<"\n";
}
}
int main()
{
Citire();
Lee();
// Afiasre();
fout<<bs(1,max(n,m));
return 0;
}