Pagini recente » Cod sursa (job #2903567) | Cod sursa (job #1255640) | Cod sursa (job #3229618) | Cod sursa (job #1866596) | Cod sursa (job #1234136)
#include<fstream>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int DMAX = 1005;
int d1[] = {0,1,-1,0};
int d2[] = {1,0,0,-1};
int v[DMAX][DMAX],viz[DMAX][DMAX],sol[DMAX][DMAX],n,m;
struct punct{
int x,y;
};
struct punct start,finish;
queue<struct punct> coada;
void citire()
{
struct punct now;
char c;
in>>n>>m;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= m ; j++)
{
in>>c;
switch(c){
case '.':v[i][j] = 0;
break;
case '*':v[i][j] = 1;
break;
case 'D':{
v[i][j] = 1;
now.x = i;
now.y = j;
coada.push(now);
}
break;
case 'I':{
v[i][j] = 0;
start.x = i;
start.y = j;
}
break;
case 'O':{
v[i][j] = 0;
finish.x = i;
finish.y = j;
}
break;
}
}
for(int i = 0 ; i <= n+1 ; i++)
v[i][0] = v[i][m+1] = 1;
for(int j = 0 ; j <= m+1 ; j++)
v[0][j] = v[n+1][j] = 1;
in.close();
}
void parcurge()
{
struct punct now,k;
int i;
while(!coada.empty()){
k = coada.front();
viz[k.x][k.y] = 1;
for(i = 0 ; i < 4 ; i++){
now.x = k.x+d1[i];
now.y = k.y+d2[i];
if(!viz[now.x][now.y] && v[now.x][now.y] == 0){
sol[now.x][now.y] = sol[k.x][k.y] + 1;
coada.push(now);
}
}
coada.pop();
}
}
bool ok(int val)
{
memset(viz,0,sizeof(viz));
struct punct now,k;
coada.push(start);
if(v[start.x][start.y] < val)
return false;
int i;
while(!coada.empty())
{
k = coada.front();
viz[k.x][k.y] = 1;
for(i = 0 ; i < 4 ; i++)
{
now.x = k.x+d1[i];
now.y = k.y+d2[i];
if(!viz[now.x][now.y] && sol[now.x][now.y] >= val){
if(finish.x == now.x && finish.y == now.y){
while(!coada.empty())
coada.pop();
return true;
}
coada.push(now);
}
}
}
return false;
}
int bin_search(int i,int j)
{
int mid;
while(i <= j){
mid = (i+j)/2;
if(ok(mid))
i = mid+1;
else
j = mid - 1;
}
if(j == 0 || j == (m+n-1))
j = -1;
return j;
}
int main()
{
citire();
parcurge();
out<<bin_search(1,n+m-1);
out.close();
return 0;
}