Pagini recente » Cod sursa (job #318079) | Cod sursa (job #2735914) | Cod sursa (job #1786817) | Cod sursa (job #2161625) | Cod sursa (job #827448)
Cod sursa(job #827448)
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
char lab[1005][1005];
unsigned int mincell[1005][1005];
bool viz[1005][1005];
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,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();
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)
{
++cost;
memset(viz,0,sizeof(viz));
cell c;
if(mincell[inceput.y][inceput.x] < cost)
return 0;
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]] != '*')
{
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;
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 = (1 << 12) ,pos;
for(pos=-1;step;step>>=1)
if(lee(pos+step))
pos+=step;
printf("%d\n",pos);
}