Cod sursa(job #3233874)

Utilizator TeogaloiuMatei Ionescu Teogaloiu Data 5 iunie 2024 11:42:58
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream cin("barbar.in");
ofstream cout ("barbar.out");
int mat[1001][1001];
bool visit[1001][1001];
struct coord
{
    int x,y;
};
bool isvalid(coord coord_c,int r,int c)
{
    return(coord_c.x>0 and coord_c.x<=r and coord_c.y>0 and coord_c.y<=c and mat[coord_c.x][coord_c.y]!=-1);
}
coord vecini[4]= {{0,1},{1,0},{0,-1},{-1,0}};
void dragon(queue<coord> q,int r,int c)
{
    while(!q.empty())
    {
        coord current=q.front();
        q.pop();
        for(int k=0; k<4; k++)
        {
            coord vecin= {current.x+vecini[k].x,current.y+vecini[k].y};
            if(isvalid(vecin,r,c) && mat[vecin.x][vecin.y] == 0)
            {
                q.push(vecin);
                mat[vecin.x][vecin.y]=mat[current.x][current.y]+1;
            }
        }
    }
}
void lee(coord strt,int r,int c,int minval)
{
    queue <coord> q;
    q.push(strt);
    visit[strt.x][strt.y] = 1;

    while(!q.empty())
    {
        coord current=q.front();
        q.pop();
        for(int k=0; k<4; k++)
        {
            coord vecin={current.x+vecini[k].x,current.y+vecini[k].y};
            if(isvalid(vecin,r,c) and visit[vecin.x][vecin.y]==0 and mat[vecin.x][vecin.y]>=minval)
            {
                q.push(vecin);
                visit[vecin.x][vecin.y]=1;
            }
        }
    }
}
int cautbin(int r,int c,coord inc,coord ies)
{
    int st=0,dr=2001,lastval=-1;
    while(st<=dr)
    {
        memset(visit,0,sizeof visit);
        int med=(st+dr)/2;
        lee(inc,r,c,med);
//        for(int i=1; i<=r; i++)
//        {
//            cout<<'\n';
//            for(int j=1; j<=c; j++)
//                cout<<visit[i][j];
//        }
        if(visit[ies.x][ies.y])
        {
            st=med+1;
            lastval=med;
        }
        else {
            dr=med-1;
        }
    }
    return lastval;
}
int main()
{
    queue <coord> drag;
    coord inc,ies;
    int r,c;
    cin>>r>>c;
    for(int i=1; i<=r; i++)
    {
        string s;
        cin>>s;
        for(int j=0; j<c; j++)
        {
            /// lib=0,perete=-1,dragon=1,start=2,end=3
            char x;
            x=s[j];
            if(x=='*')
                mat[i][j+1]=-1;
            if(x=='D')
            {
                coord temp;
                temp.x=i;
                temp.y=j+1;
                drag.push(temp);
                mat[i][j+1]=0;
            }

            if(x=='I')
            {
                inc.x=i;
                inc.y=j+1;
            }
            if(x=='O')
            {
                ies.x=i;
                ies.y=j+1;
            }
        }
    }
    dragon(drag,r,c);
//    for(int i=1; i<=r; i++)
//    {
//        cout<<'\n';
//        for(int j=1; j<=c; j++)
//            cout<<mat[i][j];
//    }
    int rasp=cautbin(r,c,inc,ies);
    cout<<rasp;
    return 0;
}