Cod sursa(job #3199308)

Utilizator RosuDragos123Rosu Dragos RosuDragos123 Data 1 februarie 2024 13:36:00
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <queue>
#define dim 1002
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int INF=1e9;
const int di[]={1,0,-1,0};
const int dj[]={0,1,0,-1};
int n,m,i1,j1,i2,j2;
char mat[dim][dim];
int a[dim][dim],dp[dim][dim];
queue<pair<int,int>> q;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            cin>>mat[i][j];
            a[i][j]=INF;
            dp[i][j]=-1;
        }

    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(mat[i][j]=='D')
            {
                a[i][j]=0;
                q.push(make_pair(i,j));
            }
            if(mat[i][j]=='I')
                i1=i , j1=j;
            if(mat[i][j]=='O')
                i2=i , j2=j;
        }
    while(!q.empty())
    {
        int cur1=q.front().first , cur2=q.front().second;
        q.pop();
        for(int k=0;k<4;k++)
        {
            int urm1=cur1+di[k];
            int urm2=cur2+dj[k];
            if(mat[urm1][urm2]!='*' && a[urm1][urm2]>a[cur1][cur2]+1)
            {
                a[urm1][urm2]=a[cur1][cur2]+1;
                q.push(make_pair(urm1,urm2));
            }
        }
    }
    q.push(make_pair(i1,j1));
    dp[i1][j1]=a[i1][j1];
    while(!q.empty())
    {
        int cur1=q.front().first , cur2=q.front().second;
        q.pop();
        for(int k=0;k<4;k++)
        {
            int urm1=cur1+di[k];
            int urm2=cur2+dj[k];
            if(dp[urm1][urm2]<min(dp[cur1][cur2],a[urm1][urm2]))
            {
                dp[urm1][urm2]=min(dp[cur1][cur2],a[urm1][urm2]);
                q.push(make_pair(urm1,urm2));
            }
        }
    }
    cout<<dp[i2][j2];
    return 0;
}