Pagini recente » Cod sursa (job #2369639) | Cod sursa (job #2420305) | Cod sursa (job #2114878) | Cod sursa (job #1964119) | Cod sursa (job #2033551)
#include <iostream>
#include <fstream>
#include <queue>
#include <deque>
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()
{
if(x.first+dri[v]>0 && x.first+dri[v]<=c && x.second+drj[v]>0 && x.second+drj[v]<=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() && 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]=0; 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() )
{
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;
}