Cod sursa(job #587881)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 6 mai 2011 12:44:22
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#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&&a[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));
                    if(i==y.ii&&j==y.jj){
						for(;q.empty();q.pop());
						return 1;
						}
					a[i][j]=min;
                    }
                }
          }
	
	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=b[x.ii][x.jj];
	srq(1,b[x.ii][x.jj]);
	freopen ("barbar.out","w",stdout);
	printf("%d\n",r);
	
return 0;}