Cod sursa(job #2544853)

Utilizator Iulia_DianaIulia Diana Iulia_Diana Data 12 februarie 2020 16:27:03
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[1005][1005], b[1005][1005], i, j, n, m, ls, cs, lf, cf, x[4]={0, 1, 0, -1}, y[4]={1, 0, -1, 0};
char ch;
deque <int> dx;
deque <int> dy;
void sett()
{
    int i;
    for(i=0; i<=n+1; i++)
    {
        a[i][0]=a[i][m+1]=-1;
        b[i][0]=b[i][m+1]=-1;
    }

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

}
void lee1()
{
    int l, c;
    while(!dx.empty())
    {
        l=dx.front();
        c=dy.front();
        for(i=0; i<4; i++)
            if(a[l+x[i]][c+y[i]]==0 || a[l+x[i]][c+y[i]]>a[l][c]+1)
            {
                a[l+x[i]][c+y[i]]=a[l][c]+1;
                dx.push_back(l+x[i]);
                dy.push_back(c+y[i]);
            }
        dx.pop_front();
        dy.pop_front();
    }
}
void lee()
{
    int l, c, i, maxx;
    dx.push_back(ls);
    dy.push_back(cs);
    while(!dx.empty())
    {
        l=dx.front();
        c=dy.front();
        for(i=0; i<4; i++)
        {
            maxx=min(b[l][c], a[l+x[i]][c+y[i]]);
            if(b[l+x[i]][c+y[i]]==0 || b[l+x[i]][c+y[i]]>maxx)
            {
                b[l+x[i]][c+y[i]]=maxx;
                dx.push_back(l+x[i]);
                dy.push_back(c+y[i]);
            }
        }
        dx.pop_front();
        dy.pop_front();
    }
}
int main()
{
    fin >> n >> m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            fin >> ch;
            if(ch=='D')
            {
                a[i][j]=1;
                b[i][j]=-1;
                dx.push_back(i);
                dy.push_back(j);
            }
            if(ch=='*')
            {
                a[i][j]=-1;
                b[i][j]=-1;
            }
            if(ch=='I')
            {
                ls=i;
                cs=j;
            }
            if(ch=='O')
            {
                lf=i;
                cf=j;
            }
        }
    sett();
    lee1();
//    for(i=1; i<=n; i++)
//    {
//        for(j=1; j<=m; j++)
//            fout << a[i][j] << " ";
//        fout << "\n";
//    }
    b[ls][cs]=a[ls][cs];
    lee();
    fout << b[lf][cf];
    return 0;
}