Pagini recente » Cod sursa (job #2007348) | Cod sursa (job #353268) | Cod sursa (job #2824840) | Cod sursa (job #2007042)
#include <fstream>
#include <queue>
#include <bitset>
using namespace std;
ifstream f ("barbar.in");
ofstream g ("barbar.out");
const int nmax=1e3+5;
bitset <nmax> viz[nmax];
struct usu
{
int x,y;
};
queue <usu> q;
int mij,n,m,v[nmax][nmax],xs,xf,ys,yf,cx,cy,dx[]={-1,0,1,0},dy[]={0,1,0,-1},dist[nmax][nmax],st,dr,sol;
char s[nmax];
void read()
{
f>>n>>m;
f.get();
for(int i=1;i<=n;++i)
{
f.getline(s+1,1003);
for(int j=1;j<=m;++j)
{
if(s[j]=='I') xs=i,ys=j;
if(s[j]=='O') xf=i,yf=j;
if(s[j]=='D')
{
usu t;
t.x=i;
t.y=j;
viz[i][j]=true;
q.push(t);
}
}
}
}
bool inside(int x,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m;
}
void dragon()
{
while(!q.empty())
{
usu t=q.front();
q.pop();
for(int i=0;i<4;++i)
{
cx=dx[i]+t.x;
cy=dy[i]+t.y;
if(!inside(cx,cy)||viz[cx][cy]==true) continue;
dist[cx][cy]=dist[t.x][t.y]+1;
dr=max(dr,dist[cx][cy]);
viz[cx][cy]=true;
usu p;
p.x=cx;
p.y=cy;
q.push(p);
}
}
}
void clean()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j) viz[i][j]=false;
}
}
void trip()
{
viz[xs][ys]=true;
usu t;
t.x=xs;
t.y=ys;
q.push(t);
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;++i)
{
cx=t.x+dx[i];
cy=t.y+dy[i];
if(!inside(cx,cy)||viz[cx][cy]==true||dist[cx][cy]<mij) continue;
viz[cx][cy]=true;
usu p;
p.x=cx;
p.y=cy;
q.push(p);
}
}
}
void solve()
{
st=1;
while(st<=dr)
{
mij=(st+dr)/2;
clean();
trip();
if(viz[xf][yf]==true)
{
sol=mij;
st=mij+1;
}
else dr=mij-1;
}
}
int main()
{
read();
dragon();
//solve();
g<<-1;
return 0;
}