Cod sursa(job #2143314)

Utilizator sichetpaulSichet Paul sichetpaul Data 25 februarie 2018 20:16:10
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <queue>
using namespace std;
queue <int> lin;
queue <int> col;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int a[1003][1003],d[1003][1003],n,m,x1,x2,y1,y2;
bool Lee(int k) {
    int x,y,l,c,i,j;
   while (!lin.empty())
    lin.pop(),col.pop();
    for (i=1;i<=n;++i)
    for (j=1;j<=m;++j)
      if (a[i][j]>0) a[i][j]=0;

    lin.push(x1),col.push(y1);
    while (!lin.empty()) {
        x=lin.front();
        y=col.front();
        for (int p=0;p<4;++p) {
            l=x+dx[p];
            c=y+dy[p];
            if (a[l][c]==0 && d[l][c]>=k) {
                lin.push(l);
                col.push(c);
                if (l==x2 && c==y2) return 1;
            }
            a[l][c]=1;
        }
            lin.pop(),col.pop();
    }
    return 0;
}
int main()
{ int i,j,st,dr,mij,sol=0,x,y,l,c;char ch;
    ifstream f("barbar.in");
    ofstream g("barbar.out");
    f>>n>>m;
    for (i=1;i<=n;++i)
    for (j=1;j<=m;++j) {
        f>>ch;
        if (ch=='*' || ch=='D') a[i][j]=-1;
        if (ch=='D') lin.push(i),col.push(j);
        if (ch=='I') x1=i,y1=j;
        if (ch=='O') x2=i,y2=j;
    }
    for (i=0;i<=n+1;++i)
        a[i][0]=a[i][m+1]=d[i][0]=d[i][m+1]=-1;
    for (j=0;j<=m+1;++j)
        a[0][j]=a[n+1][j]=d[0][j]=d[n+1][j]=-1;

     while (!lin.empty()) {
        x=lin.front(),y=col.front();
        for (int p=0;p<4;++p) {
            l=x+dx[p];
            c=y+dy[p];
            if (a[l][c]==0 && d[l][c]==0) {
                d[l][c]=d[x][y]+1;
                lin.push(l);
                col.push(c);
        }
        }
        lin.pop(),col.pop();
     }
     st=1,dr=n*m;
     while (st<=dr) {
        mij=(st+dr)/2;
        if (Lee(mij)) sol=max(sol,mij),st=mij+1;
        else dr=mij-1;
     }
     g<<sol;
    return 0;
}