Cod sursa(job #1092515)

Utilizator bogdaniliBogdan Iliescu bogdanili Data 27 ianuarie 2014 10:14:10
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <fstream>
#include <string.h>
#define inf 2000000000;
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1},mij,i,j,n,m,a[1002][1002],b[1001][1001],q[2][1001*1001],sol,st,dr,ok,u,p,x1,x2,y1,y2,viz[1001][1001];
char ch;
void coada(){
    int c,l,i,p;
    p=1;
    while(p<=u){
        for(i=1;i<=4;i++){
            l=q[0][p]+dx[i];
            c=q[1][p]+dy[i];
            if(a[l][c]==1&&b[q[0][p]][q[1][p]]+1<b[l][c]){
                u++;
                b[l][c]=b[q[0][p]][q[1][p]]+1;
                q[0][u]=l;
                q[1][u]=c;
            }
        }
            p++;

}
}

int lee(int k){
    int u=p=1;
    int l,c;
    memset(viz,0,sizeof(viz));
    if(b[x1][y1]<k)
        return 0;
    q[0][p]=x1;
    q[1][p]=y1;
    viz[x1][y1]=1;
        while(p<=u){
        for(int i=1;i<=4;i++){
            l=q[0][p]+dx[i];
            c=q[1][p]+dy[i];
            if(a[l][c]==1&&b[l][c]>=k&&viz[l][c]==0){
                u++;
                viz[l][c]=1;
                if(l==x2&&c==y2)
                    return 1;
                q[0][u]=l;
                q[1][u]=c;
            }
        }
            p++;

}
return 0;
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            f>>ch;
            if(ch=='.'){
                a[i][j]=1;b[i][j]=inf;}
                else
                    if(ch=='D'){
                        q[0][++u]=i;
                        q[1][u]=j;
                        a[i][j]=1;
                    }
                    else
                       if(ch=='I'){
                          a[i][j]=1;b[i][j]=inf;
                          x1=i;y1=j;
                       }
                     else
                        if(ch=='O'){
                             a[i][j]=1;b[i][j]=inf;
                             x2=i;y2=j;
                        }
                       else
                         {
                             b[i][j]=inf;
                         }

        }
        coada();

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

        }
    g<<sol;
    return 0;
}