Cod sursa(job #2205831)

Utilizator baiatu.danielaBaiatu Bianca baiatu.daniela Data 20 mai 2018 13:59:06
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

const int N=1005;

struct punct{
    int lin,col;
};

int viz[N][N];
int n,m,flacari[N][N],start_x,start_y,fin_x,fin_y;
char harta[N][N];
vector<punct> dragoni;
int modul(int n)
{
    if(n>0)
        return n;
    return -n;
}
void marcheaza(int d)
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            bool ok=false;
            for(auto &k :dragoni)
                {
                    int dct=modul(k.lin-i)+modul(k.col-j)+1;
                    if(dct<=d)
                        ok=true;
                }
            if(ok){
                flacari[i][j] = d;
            }
        }
}

int addx[] = {0, 1, 0, -1};
int addy[] = {-1, 0, 1, 0};

bool point_is_inside(int x, int y){
    return x>0 && x<=m && y>0 && y<=n;
}

#include<list>
bool poate_ajunge(int raza){
    list<punct> q;
    punct inceput;
    inceput.col = start_x;
    inceput.lin = start_y;

    q.push_back(inceput);
    while(!q.empty()){
        punct pct_crt = q.front();

        if(pct_crt.lin == fin_y && pct_crt.col == fin_x)
            return true;

        viz[pct_crt.lin][pct_crt.col] = raza;

        //cout<<pct_crt.lin<<" "<<pct_crt.col<<"\n";

        for(int dir=0; dir<4; ++dir){
            punct pct_nou;
            pct_nou.lin = pct_crt.lin + addy[dir];
            pct_nou.col = pct_crt.col + addx[dir];
            int i = pct_nou.lin;
            int j = pct_nou.col;

            if(point_is_inside(pct_nou.col, pct_nou.lin) && viz[i][j] != raza && harta[i][j] != '*' && flacari[i][j] != raza){
                q.push_back(pct_nou);
            }
        }

        q.pop_front();
    }
    return false;
}

int main()
{
    int i,j;
    fin>>n>>m;
    fin.getline(harta[0], N);
    for(i=1; i<=n; i++){
        fin.getline(harta[i]+1,N);
    }
    //for(i=1; i<=n; i++) cout<<harta[i]+1<<'\n';

    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j)
            if(harta[i][j] == 'D')
            {
                punct p;
                p.lin = i;
                p.col = j;
                dragoni.push_back(p);
            }
            else if(harta[i][j] == 'I'){
                start_x = j;
                start_y = i;
            }
            else if(harta[i][j] == 'O'){
                fin_x = j;
                fin_y = i;
            }

    //for(auto &x : dragoni) cout<<x.lin<<", "<<x.col<<"\n";


   /* for(int i=1; i<=n; ++i){
        for(int j=1; j<=m; ++j)
            cout<<flacari[i][j]<<" ";
        cout<<"\n";
}*/
    for(i=n*2; i>=1; --i)
    {
        marcheaza(i);
        //cout<<"Poate ajunge (raza = "<<i<<"): "<<poate_ajunge(i)<<"\n";
        if(poate_ajunge(i) == 1)
            break;
    }

    //cout<<"i ="<<i;

    if(i > 0)
        fout<<i;
    else
        fout<<"-1";
}