Cod sursa(job #1145277)

Utilizator 0051David Sera 0051 Data 18 martie 2014 08:20:49
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

#define MAX 1002

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


deque < pair < int , int > > q;

int a[MAX][MAX],b[MAX][MAX];
bool viz[MAX][MAX];
char c[MAX];

int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

int main()
{
    int n,m,i,j,x1,x2,y1,y2, ni, nj;
    char x;
    fin>>n>>m;
    fin.get();
    for(i=1;i<=n;i++)
    {
        fin.getline(c, MAX);
        for(j=0;j<m;j++){
            x=c[j];
            if(x=='.')
                a[i][j+1]=0;
            if(x=='D'){
                a[i][j+1]=0;
                q.push_back(make_pair(i,j+1));
                viz[i][j+1]=1;
            }
            if(x=='I'){
                x1=i;
                y1=j+1;
            }
            if(x=='O'){
                x2=i;
                y2=j+1;
            }
            if(x=='*')
                a[i][j+1]=-1;
        }
    }
    for(i=0;i<=n;i++)
        a[i][0]=a[i][m+1]=b[i][0]=b[i][m+1]=-1;
    for(i=0;i<=m;i++)
        a[0][i]=a[n+1][i]=b[0][i]=b[n+1][i]=-1;
    while(!q.empty())
    {
        i=q.front().first;
        j=q.front().second;
        q.pop_front();

        if(!a[i-1][j] && (!viz[i-1][j])){
            q.push_back(make_pair(i-1,j));
            a[i-1][j]=a[i][j]+1;
            viz[i-1][j]=1;
        }
        if(!a[i+1][j]&&(!viz[i+1][j])){
            q.push_back(make_pair(i+1,j));
            a[i+1][j]=a[i][j]+1;
            viz[i+1][j]=1;
        }
        if(!a[i][j-1]&&(!viz[i][j-1])){
            q.push_back(make_pair(i,j-1));
            a[i][j-1]=a[i][j]+1;
            viz[i][j-1]=1;
        }
        if(!a[i][j+1]&&(!viz[i][j+1])){
            q.push_back(make_pair(i,j+1));
            a[i][j+1]=a[i][j]+1;
            viz[i][j+1]=1;
        }
    }
    b[x1][y1]=a[x1][y1];
    q.push_front(make_pair(x1,y1));
    while(!q.empty())
    {
        i=q.front().first;
        j=q.front().second;
        q.pop_front();
        for(x=0;x<4;x++)
        {
            ni=i+d[x][0];
            nj=j+d[x][1];
            if(a[ni][nj]>=0 && !b[ni][nj])
            {
                if(a[ni][nj]>=b[i][j]){
                    b[ni][nj]=b[i][j];
                    q.push_front(make_pair(ni,nj));
                }
                else{
                    b[ni][nj]=a[ni][nj];
                    q.push_back(make_pair(ni,nj));
                }
            }
        }
    }
    fout<<b[x2][y2]<<endl;
    cout<<(sizeof(a)+sizeof(b)+sizeof(viz))/1024;
    return 0;
}