Cod sursa(job #587888)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 6 mai 2011 12:50:31
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 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&&(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;}