Cod sursa(job #1110458)

Utilizator 0051David Sera 0051 Data 18 februarie 2014 08:48:30
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <iomanip>

using namespace std;

#define MAX 1005

ifstream fin("barbar.in");
ofstream fout("barbar.out");

queue < pair < int , int > > coada;

int a[MAX][MAX];
bool viz[MAX][MAX];

int main()
{
    int n,m,i,j,x1,x2,y1,y2;
    char x;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            fin>>x;
            if(x=='.')
                a[i][j]=0;
            if(x=='D'){
                a[i][j]=0;
                coada.push(make_pair(i,j));
                viz[i][j]=1;
            }
            if(x=='I'){
                x1=i;
                y1=j;
            }
            if(x=='O'){
                x2=i;
                y2=j;
            }
            if(x=='*')
                a[i][j]=-1;
        }
    for(i=0;i<=n;i++)
        a[i][0]=a[i][n+1]=-1;
    for(i=0;i<=m;i++)
        a[0][i]=a[m+1][i]=-1;
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        viz[i][j]=1;
        if(!a[i-1][j]&&(!viz[i-1][j])){
            coada.push(make_pair(i-1,j));
            a[i-1][j]=a[i][j]+1;
        }
        if(!a[i+1][j]&&(!viz[i+1][j])){
            coada.push(make_pair(i+1,j));
            a[i+1][j]=a[i][j]+1;
        }
        if(!a[i][j-1]&&(!viz[i][j-1])){
            coada.push(make_pair(i,j-1));
            a[i][j-1]=a[i][j]+1;
        }
        if(!a[i][j+1]&&(!viz[i][j+1])){
            coada.push(make_pair(i,j+1));
            a[i][j+1]=a[i][j]+1;
        }
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            viz[i][j]=0;
    coada.push(make_pair(x1,y1));
    int k,ok=1;
    k=a[x1][x2]+1;
    while(ok){
        k--;
        while(!coada.empty())
        {
            i=coada.front().first;
            j=coada.front().second;
            coada.pop();
            viz[i][j]=1;
            if(a[i-1][j]>=k&&(!viz[i-1][j]))
                coada.push(make_pair(i-1,j));
            if(a[i+1][j]>=k&&(!viz[i+1][j]))
                coada.push(make_pair(i+1,j));
            if(a[i][j-1]>=k&&(!viz[i][j-1]))
                coada.push(make_pair(i,j-1));
            if(a[i][j+1]>=k&&(!viz[i][j+1]))
                coada.push(make_pair(i,j+1));
        }
        ok=1;
        if(viz[x2][y2])
            ok=0;
    }
    fout<<k<<endl;
    return 0;
}