Pagini recente » Cod sursa (job #27806) | Cod sursa (job #3192010) | Cod sursa (job #1478163) | Cod sursa (job #3162658) | Cod sursa (job #2033557)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int cost[1001][1001];
bool viz[1001][1001];
queue<pair<int,int> > q;
pair<int,int> pr,ul,x;
int dri[]={0,1,0,-1},drj[]={1,0,-1,0};
int c,r,i,j,v,st,dr,mij;
char a;
int ok(int x,int y)
{
if(x>0 && x<=c && y>0 && y<=r)
return 1;
return 0;
}
void reviz()
{
for(int i=1;i<=c;i++)
for(int j=1;j<=r;j++)
viz[i][j]=0;
}
int bfs(int k)
{
reviz();
q.push(pr);
while(!q.empty())
{
x=q.front();
q.pop();
for(v=0;v<4;v++)
{
int xi=x.first+dri[v],xj=x.second+drj[v];
if(!viz[xi][xj] && ok(xi,xj) && cost[xi][xj]>k)
{
viz[xi][xj]=1;
q.push(make_pair(xi,xj));
}
}
}
return viz[ul.first][ul.second];
}
int main()
{
in>>c>>r;
for (i=1;i<=c;i++)
for(j=1;j<=r;j++)
{
in>>a;
if (a=='D') {cost[i][j]=-1; q.push(make_pair(i,j));}
if (a=='*') cost[i][j]=-1;
if (a=='I') pr=make_pair(i,j);
if (a=='O') ul=make_pair(i,j);
}
while (!q.empty())
{
x=q.front();
q.pop();
for(v=0;v<4;v++)
{
if(!viz[x.first+dri[v]][x.second+drj[v]] && ok(x.first+dri[v],x.second+drj[v]) )
{
viz[x.first+dri[v]][x.second+drj[v]]=1;
cost[x.first+dri[v]][x.second+drj[v]]=cost[x.first][x.second]+1;
q.push(make_pair(x.first+dri[v],x.second+drj[v]));
}
}
}
dr=1024;
st=cost[pr.first][pr.second];
while (dr-st>1)
{
mij=(st+dr)/2;
if(bfs(mij)) st=mij;
else dr=mij;
}
//while(!bfs(mij))mij--;
while(bfs(mij))mij++;
out<<mij-1;
}