Cod sursa(job #2076723)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 26 noiembrie 2017 23:54:20
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
queue<pair<int,int> > Q;
int n,m,xs,ys,xf,yf;
char v[1005][1005];
int dist[1005][1005];
bitset<1001>viz[1001];
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
void lee()
{
    while(Q.size())
    {
        int a=Q.front().first;
        int b=Q.front().second;
        for(int i=0;i<4;i++)
        {
            int x=a+dx[i];
            int y=b+dy[i];
            if(v[x][y]=='.' && (dist[x][y]==0 || dist[x][y]>dist[a][b]+1))
               {
                   dist[x][y]=dist[a][b]+1;
                   Q.push(make_pair(x,y));
               }
        }
        Q.pop();
    }
}
bool verif(int mij)
{
    Q.push(make_pair(xs,ys));
    while(Q.size())
    {
        int a=Q.front().first;
        int b=Q.front().second;
        for(int i=0;i<4;i++)
        {
            int x=a+dx[i];
            int y=b+dy[i];
            if((v[x][y]=='.' && dist[x][y]>=mij && viz[x][y]==0))
               {
                   viz[x][y]=1;
                   Q.push(make_pair(x,y));
               }
        }
        Q.pop();
    }
    if(viz[xf][yf]==1) return 1;
    else return 0;
}
int main()
{
    int n,m,i,j;
    fin>>n>>m;
    for(i=1;i<=n;i++) fin>>(v[i]+1);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(v[i][j]=='D') Q.push(make_pair(i,j));
            if(v[i][j]=='I') xs=i,ys=j,v[i][j]='.';
            if(v[i][j]=='O') xf=i,yf=j,v[i][j]='.';
        }
    }
    lee();
    int st=0,dr=n*m+1,mij,last=0;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verif(mij)==1)
        {
            last=mij;
            st=mij+1;
        }
        else dr=mij-1;
        memset(viz,0,sizeof(viz));
    }
    if(last==0)
    {
        fout<<-1;
    }
    else fout<<last;
}