Cod sursa(job #2971473)

Utilizator BursucTangCostache Tudor Andrei BursucTang Data 27 ianuarie 2023 14:18:34
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <cstring>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,d[1001][1001],xi,xf,yi,yf;
short int mat[1001][1001];
bool viz[1001][1001];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
struct coada{
int l,c;
};
queue<coada>q;

int lee(int k){

memset(viz,0,sizeof(viz));
if(d[xi][yi]>k)
{
    q.push({xi,yi});
    viz[xi][yi]=1;
}
else
    return 0;


 while(!q.empty()){
            int l=q.front().l;
            int c=q.front().c;
            q.pop();
            for(int D=0;D<=3;D++){
                int lv=l+dx[D];
                int cv=c+dy[D];
                if(lv>=1&&lv<=n&&cv>=1&&cv<=m)
                   {
                       if(mat[lv][cv]==0&&viz[lv][cv]==0&&d[lv][cv]>k)
                       {
                           viz[lv][cv]=1;
                           q.push({lv,cv});
                       }
                   }

            }
    }

return viz[xf][yf]==1;
}


int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
        char ch;
        fin>>ch;
        if(ch=='D'){
           mat[i][j]=2;
           q.push({i,j});
           d[i][j]=1;
        }
        else
            if(ch=='*')
               mat[i][j]=1;
        else
            if(ch=='I')
        {
            xi=i;
            yi=j;
        }
        else
            if(ch=='O'){
                xf=i;
                yf=j;

            }
    }
          while(!q.empty()){
            int l=q.front().l;
            int c=q.front().c;
            q.pop();
            for(int D=0;D<=3;D++){
                int lv=l+dx[D];
                int cv=c+dy[D];
                if(lv>=1&&lv<=n&&cv>=1&&cv<=m)
                   {
                       if(mat[lv][cv]==0&&d[lv][cv]==0)
                       {
                           d[lv][cv]=d[l][c]+1;
                           q.push({lv,cv});
                       }
                   }

            }
          }

          int st=0;
          int dr=n*m;
          int sol=-1;
          while(st<=dr){
            int mid=(st+dr)/2;
            int ok=lee(mid);
            if(ok==1)
            {
                sol=mid;
                st=mid+1;
            }
            else
                dr=mid-1;



          }

          fout<<sol;
    return 0;
}