Pagini recente » Cod sursa (job #2938783) | Cod sursa (job #2847393) | Cod sursa (job #1770857) | Cod sursa (job #2086939) | Cod sursa (job #587888)
Cod sursa(job #587888)
#include <cstdio>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <queue>
using namespace std;
#define nn 1001
#define ii first
#define jj second
const int di[]={-1,1,0,0},
dj[]={0,0,-1,1};
queue<pair <int,int> > q;
int n,m,r;
char a[nn][nn],b[nn][nn];
pair<int ,int >x,y;
void lee_1 (){
while(!q.empty()){
pair<int,int> t=q.front();
for(int k=0;k<4;++k){
int i=t.ii+di[k],j=t.jj+dj[k];
if(i>0&&j>0&&i<=n&&j<=m&&(b[i][j]==0||b[i][j]>b[t.ii][t.jj]+1)){
b[i][j]=b[t.ii][t.jj]+1;
q.push(make_pair(i,j));
}
}
q.pop();
}
}
int lee_2 (int min){
if (b[x.ii][x.jj]<min)return 0;
q.push(x);
while(!q.empty()){
pair<int,int> t=q.front();
q.pop();
for(int k=0;k<4;++k){
int i=t.ii+di[k],j=t.jj+dj[k];
if(i>0&&j>0&&i<=n&&j<=m&&b[i][j]>=min&&a[i][j]!=min&&a[i][j]>=0){
q.push(make_pair(i,j));
a[i][j]=min;
if(i==y.ii&&j==y.jj){
for(;q.size();q.pop());
return 1;
}
}
}
}
return 0;}
void srq (int st, int dr)
{
if (st==dr)
{
if (st>r && lee_2(st))
r=st;
return;
}
int mid=(st+dr)>>1;
if (lee_2 (mid)==1)
{
if (mid>r)r=mid;
srq(mid+1, dr);
}
else
srq(st, mid);
}
int main ()
{
ifstream in ("barbar.in");
in>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
char crt;
in>>crt;
if(crt=='.'){
a[i][j]=b[i][j]=0;
}
if(crt=='*'){
a[i][j]=b[i][j]=-1;
}
if(crt=='I'){
x.ii=i;
x.jj=j;
}
if(crt=='D'){
a[i][j]=-3;
b[i][j]=1;
q.push(make_pair(i,j));
}
if(crt=='O'){
y.ii=i;
y.jj=j;
}
}
lee_1();
r=0;
srq(1,b[x.ii][x.jj]);
freopen ("barbar.out","w",stdout);
printf("%d\n",r-1);
return 0;}