Cod sursa(job #1090489)

Utilizator ShaDoWsiD100Rzv Rzv ShaDoWsiD100 Data 22 ianuarie 2014 19:09:47
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>
#include<string.h>
#define INF 2000000000
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,i,j,a[1001][1001],b[1001][1001],q[2][1001*1001],m,p,u,dx[4]={-1,0,0,1},dy[4]={0,1,-1,0},sol,ok,viz[1001][1001],x1,y1,x2,y2;
char ch;
int lee(int k){
    int p,u,l,c,i;
    p=u=1;
    if(b[x1][y1]<k)
      return 0;
    memset(viz,0,sizeof(viz));
    viz[x1][y1]=1;
    q[0][p]=x1;
    q[1][p]=y1;
    while(p<=u&&viz[x2][y2]==0){
        for(i=0;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)
                {
                    viz[l][c]=1;
                    q[0][++u]=l;
                    q[1][u]=c;
                    if(l==x2&&c==y2)
                      return 1;

                }
        }
        p++;

    }
    return 0;

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

    while(p<=u){
        int l=q[0][p];
        int c=q[1][p];
        for(i=0;i<=3;i++)
            if(a[l+dx[i]][c+dy[i]]!=0 && b[l][c]+1<b[l+dx[i]][c+dy[i]]){
                q[0][++u]=l+dx[i];
                q[1][u]=c+dy[i];
                b[l+dx[i]][c+dy[i]]=b[l][c]+1;
            }
       p++;
    }
    int st=0;
    int dr=n*m;
    sol=-1;
    while(st<=dr){
        int mij=(st+dr)/2;
        ok=lee(mij);
        if(ok==1){
          sol=mij;
    st=mij+1;

        }
        else
        dr=mij-1;

    }
    g<<sol;
    return 0;
}