Pagini recente » Cod sursa (job #214312) | Cod sursa (job #50891) | Cod sursa (job #1903790) | Cod sursa (job #732731) | Cod sursa (job #827433)
Cod sursa(job #827433)
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
char lab[1002][1002];
unsigned int mincell[1002][1002];
bool viz[1002][1002];
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,0};
int costmaxim=0;
struct cell
{
int y,x;
};
cell inceput,sfarsit;
inline int _min(int a,int b)
{
if(a<b)
return a;
return b;
}
queue<cell> q;
void lee2()
{
cell c;
int i;
while(!q.empty())
{
c = q.front();
q.pop();
if(mincell[c.y][c.x] > costmaxim)
costmaxim = mincell[c.y][c.x];
for(i=0;i<4;++i)
{
if(lab[c.y+dy[i]][c.x+dx[i]] != '*' && lab[c.y+dy[i]][c.x+dx[i]])
if(!mincell[c.y+dy[i]][c.x+dx[i]])
{
mincell[c.y+dy[i]][c.x+dx[i]] = mincell[c.y][c.x] + 1;
q.push((cell){c.y+dy[i],c.x+dx[i]});
}
}
}
}
bool lee(int cost)
{
memset(viz,0,sizeof(viz));
cell c;
q.push(inceput);
viz[inceput.y][inceput.x]=1;
int i;
while(!q.empty())
{
c = q.front();
q.pop();
for(i=0;i<4;++i)
if(lab[c.y + dy[i]][c.x+dx[i]] == '.' || lab[c.y + dy[i]][c.x+dx[i]] == 'O')
{
if(mincell[c.y+dy[i]][c.x+dx[i]] >= cost && !viz[c.y+dy[i]][c.x+dx[i]])
{
viz[c.y+dy[i]][c.x+dx[i]]=1;
q.push((cell){c.y+dy[i],c.x+dx[i]});
}
}
}
return viz[sfarsit.y][sfarsit.x];
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int n,m,i,j;
setvbuf(stdin,NULL,_IOFBF,32768);
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
scanf(" %c ",&lab[i][j]);
if(lab[i][j] == 'I')
inceput= (cell){i,j};
else if(lab[i][j] == 'O')
sfarsit = (cell){i,j};
else if(lab[i][j] == 'D')
q.push((cell){i,j}),mincell[i][j]=1;
}
}
lee2();
int step,pos;
//costmaxim = _min(_min(costmaxim,mincell[inceput.y][inceput.x]),mincell[sfarsit.y][sfarsit.x]);
for(step=1;step<=costmaxim;step<<=1);
for(pos=-1;step;step>>=1)
if(pos+step <= costmaxim && lee(pos+step+1))
pos+=step;
printf("%d\n",pos);
}