Cod sursa(job #1907232)

Utilizator ShutterflyFilip A Shutterfly Data 6 martie 2017 18:23:19
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <fstream>
#include <queue>
#include <bitset>
#include <cstdio>
#include <cstring>
#define NMAx 1024
#define ff first
#define ss second
#define mkp make_pair
#define min(a,b) (a<b?a:b)
using namespace std;

queue < pair<short,short> > Q;
pair <short,short> Start,Finish;
short N,M,Sol,A[NMAx][NMAx],Dx[]={1,-1,0,0},Dy[]={0,0,1,-1};
bitset <NMAx> viz[NMAx];
char S[NMAx];

bool Fill(int Val) {

    int k,X,Y,Xnou,Ynou;

    memset(viz,0,sizeof(viz));
    Q.push(Start);

    while(Q.size()) {

        X=Q.front().ff;
        Y=Q.front().ss;
        Q.pop();

        for(k=0;k<4;k++) {

            Xnou=X+Dx[k];
            Ynou=Y+Dy[k];

            if(!viz[Xnou][Ynou]&&A[Xnou][Ynou]>=Val) {
                viz[Xnou][Ynou]=1;
                Q.push(mkp(Xnou,Ynou));
                }

            }

        }

    if(viz[Finish.ff][Finish.ss])
        return 1;
    return 0;

}
int Search() {

    int Right,Step,i;

    Right=min(A[Start.ff][Start.ss],A[Finish.ff][Finish.ss]);

    for(Step=1;Step<Right;Step<<=1);

    for(i=0;Step;Step>>=1)
        if(Step+i<=Right&&Fill(i+Step))
            i+=Step;

    return i+Step;

}
void Lee() {

    int k,X,Y,Xnou,Ynou;

    while(Q.size()) {

        X=Q.front().ff;
        Y=Q.front().ss;
        Q.pop();

        for(k=0;k<4;k++) {

            Xnou=X+Dx[k];
            Ynou=Y+Dy[k];

            if(!A[Xnou][Ynou]) {
                A[Xnou][Ynou]=A[X][Y]+1;
                Q.push(mkp(Xnou,Ynou));
                }

            if(A[Xnou][Ynou]>A[X][Y]+1)
                A[Xnou][Ynou]=A[X][Y]+1;

            }
        }

}
void bordare() {

    for(int i=0;i<=M+1;i++)
        A[0][i]=A[N+1][i]=-1;

    for(int i=0;i<=N+1;i++)
        A[i][0]=A[i][M+1]=-1;

}
void citire() {

    int i,j;
    ifstream in("barbar.in");
    in>>N>>M;
    in.getline(S,3);

    for(i=1;i<=N;i++) {

        in.getline(S+1,NMAx);

        for(j=1;j<=M;j++)
            switch(S[j]) {
                case '.':break;
                case '*':A[i][j]=-1;break;
                case 'D':A[i][j]=1;Q.push(mkp(i,j));break;
                case 'I':Start=mkp(i,j);break;
                case 'O':Finish=mkp(i,j);break;
                }

        }

    in.close();

}
void afis() {

    ofstream out("barbar.out");

    out<<Sol<<'\n';

    out.close();

}
int main() {

    citire();
    bordare();

    Lee();
    Sol=Search()-1;

    afis();

    return 0;

}