Cod sursa(job #774192)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 3 august 2012 18:45:16
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <fstream>
#include <queue>
#define N 1010
#define INF 999999999
#define PI pair<int, int>
#define mp make_pair

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

int n,m,i,j,A[N][N],D[N][N],C[N][N],l1,c1,l2,c2;
string s;
queue<PI> Q;
bool InQue[N][N];

const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};

bool Ok1 (int i, int j, int l, int c)
{
    if (l<1 || l>n || c<1 || c>m) return 0;
    if (D[i][j]+1>=D[l][c]) return 0;
    if (A[l][c]!=0) return 0;
    return 1;
}

bool Ok2 (int i, int j, int l, int c)
{
    if (l<1 || l>n || c<1 || c>m) return 0;
    if (A[l][c]!=0) return 0;
    if (min(D[l][c],C[i][j])<=C[l][c]) return 0;
    return 1;
}

void Lee1 ()
{
    while (!Q.empty())
    {
        i=Q.front().first;
        j=Q.front().second;
        Q.pop();
        InQue[i][j]=0;
        for (int d=0;d<4;d++)
            if (Ok1(i,j,i+dx[d],j+dy[d]))
            {
                D[i+dx[d]][j+dy[d]]=D[i][j]+1;
                if (!InQue[i+dx[d]][j+dy[d]])
                {
                    Q.push(mp(i+dx[d],j+dy[d]));
                    InQue[i+dx[d]][j+dy[d]]=1;
                }
            }
    }
}

void Lee2 ()
{
    Q.push(mp(l1,c1));
    C[l1][c1]=D[l1][c1];
    while (!Q.empty())
    {
        i=Q.front().first;
        j=Q.front().second;
        Q.pop();
        InQue[i][j]=0;
        for (int d=0;d<4;d++)
            if (Ok2(i,j,i+dx[d],j+dy[d]))
            {
                C[i+dx[d]][j+dy[d]]=min(C[i][j],D[i+dx[d]][j+dy[d]]);
                if (!InQue[i+dx[d]][j+dy[d]])
                {
                    Q.push(mp(i+dx[d],j+dy[d]));
                    InQue[i+dx[d]][j+dy[d]]=1;
                }
            }
    }
}



int main ()
{
    f >> n >> m;
    getline(f,s);
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
        {
            D[i][j]=INF;
            C[i][j]=-1;
        }
    for (i=1;i<=n;i++)
    {
        getline(f,s);
        for (j=0;j<s.size();j++)
        {
            int x=0;
            if (s[j]=='*') x=-1;
            if (s[j]=='I')
            {
                l1=i;
                c1=j+1;
            }
            if (s[j]=='O')
            {
                l2=i;
                c2=j+1;
            }
            if (s[j]=='D')
            {
                x=-2;
                Q.push(mp(i,j+1));
                InQue[i][j+1]=1;
                D[i][j+1]=0;
            }
            A[i][j+1]=x;
        }
    }
    Lee1();
    Lee2();
    g << C[l2][c2] << '\n';
    f.close();g.close();
    return 0;
}