Cod sursa(job #1081414)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 13 ianuarie 2014 16:57:12
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.39 kb
//
//  main.cpp
//  barbar
//
//  Created by Catalina Brinza on 1/10/14.
//  Copyright (c) 2014 Catalina Brinza. All rights reserved.
//

#include <fstream>
#include <queue>
#define nru 1001
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct ind
{
    int d,c;
};
int a[nru][nru],C,r;
bool viz[nru][nru];
queue<ind> q;
ind kn;

void initializare()
{int i,j;
    for (i=1;i<=r;++i) for (j=1;j<=C;++j) a[i][j]=false;
}

bool perfeeect(int i,int j,int m)
{ind w;
    if (i!=1 && a[i-1][j]>=m && !viz[i-1][j])
    {
        if (i-1==kn.c && j==kn.d) return true;
        w.c=i-1;
        w.d=j;
        q.push(w);
        viz[i-1][j]=true;
    }
    
    if (i!=r && a[i+1][j]>=m && !viz[i+1][j])
    {
        if (i+1==kn.c && j==kn.d) return true;
        w.c=i+1;
        w.d=j;
        q.push(w);
        viz[i+1][j]=true;
    }
    if (j!=1 && a[i][j-1]>=m && !viz[i][j-1])
    {
        if (i==kn.c && j-1==kn.d) return true;
        w.c=i;
        w.d=j-1;
        q.push(w);
        viz[i][j-1]=true;
    }
    if (j!=C && a[i][j+1]>=m && !viz[i][j+1])
    {
        if (i==kn.c && j+1==kn.d) return true;
        w.c=i;
        w.d=j+1;
        q.push(w);
        viz[i][j+1]=true;
    }
    return false;
    
}
int main(int argc, const char * argv[])
{int i,j,x,y,z,t,k,l;
    char car;
    
    
    ind w;
    in>>r>>C;
    for (i=1;i<=r;++i)
        for (j=1;j<=C;++j)
        {
            in>>car;
            if (car=='I')
            {
                x=i; y=j;a[i][j]=-1;
            }
            else if (car=='O')
            {
                z=i;
                t=j;
                a[i][j]=-1;
            }
            else if (car=='D') {
                a[i][j]=0;
                w.c=i;
                w.d=j;
                q.push(w);
            }
            else if (car=='*') a[i][j]=-2;
            else
                a[i][j]=-1;
        }
    initializare();
    while (!q.empty())
    {
        i=q.front().c;
        j=q.front().d;
        if (i!=1 && a[i-1][j]==-1 && !viz[i][j-1])
        {
            a[i-1][j]=a[i][j]+1;
            viz[i-1][j]=true;
            w.c=i-1;
            w.d=j;
            q.push(w);
        }
        if (i!=r && a[i+1][j]==-1 && !viz[i+1][j])
        {viz[i+1][j]=true;
            a[i+1][j]=a[i][j]+1;
            w.c=i+1;
            w.d=j;
            q.push(w);
        }
        if (j!=1 && a[i][j-1]==-1 && !viz[i][j-1])
        {
            viz[i][j-1]=true;
            a[i][j-1]=a[i][j]+1;
            w.c=i;
            w.d=j-1;
            q.push(w);
        }
        if (j!=C && a[i][j+1]==-1 && !viz[i][j+1])
        {viz[i][j+1]=true;
            a[i][j+1]=a[i][j]+1;
            w.c=i;
            w.d=j+1;
            q.push(w);
        }
        q.pop();
    }
    i=x;j=y;
    kn.c=z;
    kn.d=t;
    int min=-1,max=a[x][y],mij; bool ok2=false;
    if (a[i][j]<a[z][t]) max=a[t][z];
    while (max>min)
    {
        initializare();
        bool ok=false;
        mij=min+(max-min)/2;
        w.c=i;
        w.d=j;
        q.push(w);
        while (!q.empty())
        {
            if (perfeeect(q.front().c,q.front().d,mij))
            {
                min=mij;
                ok=true;
                ok2=true;
                while(!q.empty()) q.pop();
                break;
            }
            q.pop();
        }
        if (ok) max=mij;
        else min=mij+1;
    }
    if (!ok2) out<<-1;
    else out<<max;
    
    return 0;
}