Cod sursa(job #930229)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 27 martie 2013 15:19:25
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
#include <stdlib.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");

int dx[8]={-1, -1, -1, 0, 0, 1, 1 ,1};
int dy[8]={-1, 0, 1, -1, 1, -1, 0, 1};
int di[4]={-1, 0, 0, 1};
int dj[4]={0, -1, 1, 0};

int n, m, i, j, a[1010][1010], b[1010][1010], x, h, xi, xf, yi, yf, maxim, c[2][100010];
int k;
char s[1010];

struct dragon{
    int l, c;
} v[100010];

int lee(){
    int p=1, u=1, i, j, ii, jj;
    c[0][1]=xi;
    c[1][1]=yi;
    b[xi][yi]=-1;
    while(p<=u)
    {
        i=c[0][p];
        j=c[1][p];
        for(int d=0; d<4; d++)
        {
            ii=i+di[d];
            jj=j+dj[d];
            if(ii>0 && ii<=n && jj>0 && jj<=m)
            {
				if(b[ii][jj]==2)
					return 1;
				if(b[ii][jj]==0)
				{
					u++;
					c[0][u]=ii;
					c[1][u]=jj;
					b[ii][jj]=-1;
				}
            }
        }
        p++;
    }
    return 0;
}

int cb(int p, int u){
    if(p>u)
    {
        g<<maxim+1<<"\n";
        exit(0);
    }
    int l=(p+u)/2, nr=0;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            b[i][j]=a[i][j];
    l--;
    for(int i=1; i<=k; i++)
        for(int d=0; d<8; d++)
        {
        	int a1, a2;
        	a1=v[i].l+dx[d]*l;
        	a2=v[i].c+dy[d]*l;
        	//g<<a1<<' '<<a2<<"        ";
        	if(a1<1)
				a1=1;
			else if(a1>n)
				a1=n;
			if(a2<1)
				a2=1;
			else if(a2>m)
				a2=m;
			//g<<a1<<' '<<a2<<"\n";
            b[a1][a2]=4;
        }
    l++;
    int aux=lee();
    //g<<aux<<' '<<l<<"\n";
    if(aux==1)
    {
        if(maxim<l)
            maxim=l;
        cb(l+1, u);
    }
    else
        cb(p, l-1);
}

int main(){
    f>>n>>m;
    x=max(n, m);
    for(i=1; i<=n; i++)
    {
        f.get();
        f.get(s, 1010);
        for(j=0; j<m; j++)
            if(s[j]=='I')
            {
                a[i][j+1]=1;
                xi=i;
                yi=j;
            }
            else if(s[j]=='D')
            {
                a[i][j+1]=3;
                k++;
                v[k].l=i;
                v[k].c=j;
            }
            else if(s[j]=='*')
                a[i][j+1]=4;
            else if(s[j]=='O')
            {
                a[i][j+1]=2;
                xf=i;
                yf=j;
            }
    }
    maxim=-2;
    cb(1, x);
    return 0;
}