Cod sursa(job #2671627)

Utilizator StefanaArinaStefana Arina Tabusca StefanaArina Data 12 noiembrie 2020 14:32:24
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

#define NMAX 1005

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

int a[NMAX][NMAX], b[NMAX][NMAX];
int i, j, n, m, startx, starty, finx, finy;
int di[]={0, 1, 0, -1}, dj[]={1, 0, -1, 0};
char ch;
deque <int> dx;
deque <int> dy;

void lee1()
{
    int i, j, k;
    
    while(!dx.empty())
    {
        i = dx.front();
        j = dy.front();
        for(k = 0; k < 4; k ++)
            if(a[i + di[k]][j + dj[k]] == 0 or a[i + di[k]][j + dj[k]] > a[i][j] + 1)
            {
                a[i + di[k]][j + dj[k]] =  a[i][j] + 1;
                dx.push_back(i + di[k]);
                dy.push_back(j + dj[k]);
            }
        dx.pop_front();
        dy.pop_front();
    }
}
void lee()
{
    int i, j, k, maxi;
    dx.push_back(startx);
    dy.push_back(starty);
    
    while(!dx.empty())
    {
        i = dx.front();
        j = dy.front();
        for(k = 0; k < 4; k ++)
        {
            maxi = min(b[i][j], a[i + di[k]][j + dj[k]]);
            if(b[i + di[k]][j + dj[k]] == 0 or b[i + di[k]][j + dj[k]] > maxi)
            {
                b[i + di[k]][j + dj[k]] = maxi;
                dx.push_back(i + di[k]);
                dy.push_back(j + dj[k]);
            }
        }
        dx.pop_front();
        dy.pop_front();
    }
}
int main()
{
    f >> n >> m;
    
    for(i = 1; i <= n; i ++)
        for(j = 1; j <= m; j ++)
        {
            f >> 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')
            {
                startx = i;
                starty = j;
            }
            if(ch=='O')
            {
                finx = i;
                finy = j;
            }
        }
        
     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;
    }
    
    lee1();
    
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
            g << a[i][j] << " ";
        g << "\n";
    }
    
    b[startx][starty] = a[startx][starty];

    lee();
    g<<"\n";
    
    g << b[finx][finy];
    
    return 0;
}