Pagini recente » Cod sursa (job #3157452) | Cod sursa (job #360427) | Cod sursa (job #1456995) | Cod sursa (job #2955634) | Cod sursa (job #2033590)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
queue<pair<int,int> > q;
pair<int,int> start,esire,x;
int dri[4]={0,1,0,-1};
int drj[4]={1,0,-1,0};
int C,R,i,j,st,dr,D,mid,cost[100][100],viz[100][100];
char n;
int ok(int a,int b)
{
if(a>0 && a<=C && b>0 && b<=R){
return 1;
}
return 0;
}
void reset()
{
for(int i=1;i<=C;i=i+1)
for(int j=1;j<=R;j=j+1)
viz[i][j]=0;
}
int lee(int s)
{
int xi,xj;
reset();
q.push(start);
while(!q.empty())
{
x=q.front();
q.pop();
for(D=0;D<4;D++)
{
xi=x.first+dri[D];
xj=x.second+drj[D];
if(viz[xi][xj]==0 && ok(xi,xj) && cost[xi][xj]>s)
{
q.push(make_pair(xi,xj));
viz[xi][xj]=1;
}
}
}
return viz[esire.first][esire.second];
}
int main()
{
f>>C>>R;
for (i=1;i<=C;i=i+1)
for(j=1;j<=R;j=j+1)
{
f>>n;
if (n=='D') {
viz[i][j]=-1;
q.push(make_pair(i,j));
}
if (n=='*'){
viz[i][j]=-1;
}
if (n=='I'){
start=make_pair(i,j);
}
if (n=='O'){
esire=make_pair(i,j);
}
}
while (!q.empty())
{
x=q.front();
q.pop();
for(D=0;D<4;D++)
{
int xi=x.first+dri[D];
int xj=x.second+drj[D];
if(viz[xi][xj]==0 && ok(xi,xj) )
{
viz[xi][xj]=1;
cost[xi][xj]=cost[x.first][x.second]+1;
q.push(make_pair(xi,xj));
}
}
}
dr=4000;
st=cost[start.first][start.second];
while (dr-st>=1)
{
mid=(st+dr)/2;
if(lee(mid)){
st=mid;
}
else {
dr=mid;
}
}
while(lee(mid)==0){
mid--;
}
while(lee(mid)){
mid++;
}
g<<mid;
}