Cod sursa(job #3256044)

Utilizator MegaCoderMinoiu Teodor Mihai MegaCoder Data 13 noiembrie 2024 09:22:33
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include<fstream>
#include<queue>
#include<string>
#define INF 999999999
std::ifstream fin("barbar.in");
std::ofstream fout("barbar.out");
int n, m;
int mat[1005][1005];//matricea cu distantele reale de la dragoni
int sol[1005][1005];
bool maze[1005][1005];
int iS, jS, iE, jE;
inline bool inmat(int i, int j)
{
    return (i>=0 && i<n && j>=0 && j<m);
}
int di[]={-1, 0, 1, 0}, dj[]={0, -1, 0, 1};
void read()
{
    std::fill(sol[0], sol[1004]+1004, -1);
    std::fill(mat[0], mat[1004]+1004, INF);
    fin>>n>>m;
    std::queue<std::pair<int, int>>q;
    for(int i=0; i<n; ++i)
    {
        std::string line;
        fin>>line;
        for(int j=0; j<m; ++j)
        {
            if(line[j]=='I')
                iS=i, jS=j, maze[i][j]=true;
            else if(line[j]=='O')
                iE=i, jE=j, maze[i][j]=true;
            else if(line[j]=='D')
            {
                q.emplace(i, j);//mat[i][j]=0;
                mat[i][j]=0;
            }
            else if(line[j]=='.')
                maze[i][j]=true;
        }
    }
    while(!q.empty())
    {
        int i=q.front().first, j=q.front().second;
        q.pop();
        for(int k=0; k<4; ++k)
        {
            int I=i+di[k], J=j+dj[k];
            if(inmat(I, J))
                if(mat[I][J]>mat[i][j]+1)
                {
                    mat[I][J]=mat[i][j]+1;
                    q.emplace(I, J);
                }
        }
    }
}
void solve()
{
    std::priority_queue<std::pair<int, std::pair<int, int>>>pq;
    pq.push({mat[iS][jS], {iS, jS}});
    while(!pq.empty())
    {
        int dist=pq.top().first;
        int i=pq.top().second.first, j=pq.top().second.second;
        pq.pop();
        for(int k=0; k<4; ++k)
        {
            int I=i+di[k], J=j+dj[k];
            if(inmat(I, J) && maze[I][J])
            {
                int newDist=std::min(dist, mat[I][J]);
                if(newDist>sol[I][J])
                {
                    sol[I][J]=newDist;
                    pq.push({newDist, {I, J}});
                }
            }
        }
    }
    fout<<sol[iE][jE];
}
int main()
{
    read();
    /*for(int i=0; i<n; ++i)
    {
        for(int j=0; j<m; ++j)
            fout<<mat[i][j]<<' ';
        fout<<'\n';
    }*/
    //solve();
    fout<<"-1";
    return 0;
}