Cod sursa(job #1004508)

Utilizator sebinechitasebi nechita sebinechita Data 2 octombrie 2013 21:46:39
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.77 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <cmath>
#include <queue>
#include <deque>
#include <iomanip>
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define baza 10
#define MAX 1100
typedef long long int lli;
deque <pair <lli, lli> > coada;





int a[MAX+100][MAX+100], b[MAX+100][MAX+100];
char c;

void insert(lli i, lli j)
{
    coada.push_back(make_pair(i, j));
}

int main()
{
    lli n, m, i, j;
    fin>>n>>m;
    swap(n,m);
    pair <lli, lli> init;
    pair <lli, lli> last;
    fin.get(c);

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            fin.get(c);

            if(c=='I')
            {
                init.first=i;
                init.second=j;
            }
            else if(c=='O')
            {
                last.first=i;
                last.second=j;
            }
            else if(c=='D')
            {
                a[i][j]=1;
                insert(i, j);
            }
            else if(c=='*')
            {
                a[i][j]=-1;
            }

        }
        fin.get(c);


    }


    for(i=0;i<=m+1;i++)
    {
        a[0][i]=a[n+1][i]=-1;
    }
    for(i=0;i<=n+1;i++)
    {
        a[i][0]=a[i][m+1]=-1;
    }

    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop_front();
        if(a[i-1][j]==0)
        {
            a[i-1][j]=a[i][j]+1;
            insert(i-1, j);
        }
        if(a[i][j-1]==0)
        {
            a[i][j-1]=a[i][j]+1;
            insert(i, j-1);
        }
        if(a[i+1][j]==0)
        {
            a[i+1][j]=a[i][j]+1;
            insert(i+1, j);
        }
        if(a[i][j+1]==0)
        {
            a[i][j+1]=a[i][j]+1;
            insert(i, j+1);
        }
    }


    for(i=0;i<=m+1;i++)
    {
        b[0][i]=b[n+1][i]=-1;
    }
    for(i=0;i<=n+1;i++)
    {
        b[i][0]=b[i][m+1]=-1;
    }

    i=init.first;
    j=init.second;
    b[i][j]=a[i][j];
    insert(i, j);

    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop_front();
        if(a[i+1][j]>0 && b[i+1][j]==0)
        {
            if(a[i+1][j]>=b[i][j])
            {
                b[i+1][j]=b[i][j];
                coada.push_front(make_pair(i+1, j));
            }
            else
            {
                b[i+1][j]=a[i+1][j];
                insert(i+1, j);
            }
        }
        if(a[i-1][j]>0 && b[i-1][j]==0)
        {
            if(a[i-1][j]>=b[i][j])
            {
                b[i-1][j]=b[i][j];
                coada.push_front(make_pair(i-1, j));
            }
            else
            {
                b[i-1][j]=a[i-1][j];
                insert(i-1, j);
            }
        }
        if(a[i][j-1]>0 && b[i][j-1]==0)
        {
            if(a[i][j-1]>=b[i][j])
            {
                b[i][j-1]=b[i][j];
                coada.push_front(make_pair(i, j-1));
            }
            else
            {
                b[i][j-1]=a[i][j-1];
                insert(i, j-1);
            }
        }
        if(a[i][j+1]>0 && b[i][j+1]==0)
        {
            if(a[i][j+1]>=b[i][j])
            {
                b[i][j+1]=b[i][j];
                coada.push_front(make_pair(i, j+1));
            }
            else
            {
                b[i][j+1]=a[i][j+1];
                insert(i, j+1);
            }
        }

    }

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            b[i][j]--;
        }
    }

    fout<<b[last.first][last.second];



    return 0;
}