Cod sursa(job #1094361)

Utilizator alexandru213Bracau Alexandru alexandru213 Data 29 ianuarie 2014 12:44:32
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include<string.h>
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
char ch;
int dx[]={0,-1,0,1,0},mx,q,st,dr,mij,v[1001][1001],inf=2000000,dy[]={0,0,1,0,-1},cod[2][1000001],f1,f2,s1,s2,xx,yy,p,u,n,m,i,j,a[1001][1001],b[1001][1001],x,y;
int coada2(int mn){
    p=1;
    u=1;
    memset(v,0,sizeof(v));
    cod[0][1]=s1;
    cod[1][1]=s2;
    v[s1][s2]=1;
    while(p<=u&&(cod[0][p]!=f1||cod[1][p]!=f2)){
        x=cod[0][p];
        y=cod[1][p];
        for(i=1;i<=4;i++){
            xx=x+dx[i];
            yy=y+dy[i];
            if(a[xx][yy]==1&&b[xx][yy]>=mn&&v[xx][yy]==0){
                u++;
                v[xx][yy]=1;
                cod[0][u]=xx;
                cod[1][u]=yy;

                }
                }
        p++;}
    if(p>u)
        return -1;
    return 1;
    }
void coada1(){
    int p=1;

    while(p<=u){
        x=cod[0][p];
        y=cod[1][p];
        for(i=1;i<=4;i++){
            xx=x+dx[i];
            yy=y+dy[i];
            if(a[xx][yy]==1&&b[xx][yy]>b[x][y]+1){
                u++;
                cod[0][u]=xx;
                cod[1][u]=yy;
                b[xx][yy]=b[x][y]+1;}
                }
            p++;}
    }
int main()
{
    x=y=1;
    in>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            in>>ch;
            if(ch=='.'){
                a[i][j]=1;
                b[i][j]=inf;
                continue;}
            if(ch=='*'){
                a[i][j]=-1;
                b[i][j]=inf;
                continue;
                }
            if(ch=='D'){
                u++;
                a[i][j]=1;
                cod[0][u]=i;
                cod[1][u]=j;
                b[i][j]=0;

                continue;}
            if(ch=='I'){
                a[i][j]=1;
                b[i][j]=inf;
                s1=i;s2=j;
                continue;}
            if(ch=='O'){
                a[i][j]=1;
                b[i][j]=inf;
                f1=i;f2=j;
                continue;}}
    for(i=0;i<=n+1;i++){
        a[i][0]=-1;
        a[i][m+1]=-1;}
    for(i=0;i<=m+1;i++){
        a[0][i]=-1;
        a[n+1][i]=-1;}
    coada1();
    st=1;dr=n*m+1;
    mx=-1;
    while(st<=dr){
        mij=(st+dr)/2;
        q=coada2(mij);
        if(q==1){
            mx=mij;
            st=mij+1;}
        else
        dr=mij-1;}
    out<<mx;
    return 0;
}