Cod sursa(job #821042)

Utilizator usermeBogdan Cretu userme Data 21 noiembrie 2012 16:18:27
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>

using namespace std;

const int N=1001;
const int dlin[]={0,1,0,-1};
const int dcol[]={1,0,-1,0};

char v[N][N];

int d[N][N],dr[N][N];

struct queue{
    int lin,col;
};
queue q[N*N],start,fin,a,b;

int u,p=1,r,c;

void bfs(){
    queue x,y;
    while(p<=u)
	{
		x=q[p++];
		for(int i=0;i<4;i++)
		{
			y.lin=x.lin+dlin[i];
			y.col=x.col+dcol[i];
			if(d[y.lin][y.col]==-1)
			{
				q[++u]=y;
				d[y.lin][y.col]=1+d[x.lin][x.col];
			}
		}
	}
}

void bfso(int obs){
    queue x,y;
    while(p<=u)
	{
		x=q[p++];
		for(int i=0;i<4;i++)
		{
			y.lin=x.lin+dlin[i];
			y.col=x.col+dcol[i];
			if(d[y.lin][y.col]>=obs&&dr[y.lin][y.col]==0)
			{
				q[++u]=y;
				dr[y.lin][y.col]=1+dr[x.lin][x.col];
			}
		}
	}
}

void init(){
    for(int i=0;i<r;i++)
        for(int j=0;j<c;j++)
            dr[i][j]=0;
}

int main()
{
    ifstream f("barbar.in");
    ofstream h("barbar.out");
    int i,caut=0;
    f>>r>>c>>ws;
    for(i=0;i<r;i++){
        f.getline(v[i],c+1);
    }
    for(i=0;i<r;i++)
        for(int j=0;j<c;j++){
            if(v[i][j]=='.')d[i][j]=-1;
            if(v[i][j]=='*')d[i][j]=-2;
            if(v[i][j]=='D'){
                d[i][j]=0;
                q[++u].lin=i;
                q[u].col=j;
            }
            if(v[i][j]=='I'){
                d[i][j]=-1;
                start.lin=i;
                start.col=j;
            }
            if(v[i][j]=='O'){
                d[i][j]=-1;
                fin.lin=i;
                fin.col=j;
            }
        }
    bfs();
    for(int obs=1<<19;obs;obs/=2){
        q[1]=start;
        u=1;
        p=1;
        bfso(caut+obs);
        if(dr[fin.lin][fin.col])caut+=obs;
        init();
    }
    h<<caut<<"\n";
    return 0;
}