Cod sursa(job #1300979)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 25 decembrie 2014 13:37:23
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <cstdio>
#include <queue>
#define infinit 10000000
#define nmax 1005
using namespace std;
FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");
int n,m,l1,c1,l2,c2;
int dl[4],dc[4];
int v[nmax][nmax];
int k[nmax][nmax],x[nmax][nmax];
int l[nmax*nmax],c[nmax*nmax],p=1,u,sol;
char s[nmax+5];

int main(){

    int i,j,st,dr,mid;

    fscanf(f,"%d %d",&n,&m);
    for (i=1;i<=n;i++) for (j=1;j<=m;j++) k[i][j]=infinit;
    for (i=1;i<=n;i++) {
            fscanf(f,"%s\n",&s);
            for (j=0;j<m;j++)if (s[j]=='*') v[i][j+1]=-1;
                         else if (s[j]=='D') {v[i][j+1]=-1;
                                              u++;
                                              k[i][j+1]=0;
                                              l[u]=i;c[u]=j+1;}
                         else if (s[j]=='I') {l1=i;c1=j+1;}
                         else if (s[j]=='O') {l2=i;c2=j+1;}
                            }
    dl[0]=1;
    dl[1]=-1;
    dc[2]=1;
    dc[3]=-1;
    while (p<=u) {
        for (j=0;j<4;j++) if (k[l[p]][c[p]]+1<k[l[p]+dl[j]][c[p]+dc[j]]){
                        k[l[p]+dl[j]][c[p]+dc[j]]=k[l[p]][c[p]]+1;
                        u++;
                        l[u]=l[p]+dl[j];
                        c[u]=c[p]+dc[j];}
                p++;
                }
    sol=-1;
    st=1;dr=nmax*10;
    while (st<=dr){for (i=1;i<=n;i++) for (j=1;j<=m;j++) x[i][j]=1;
            x[l1][c1]=0;
            mid=(st+dr)>>1;
            p=1;u=1;
            l[1]=l1;c[1]=c1;
            while (p<=u){
                for (j=0;j<4;j++) if (k[l[p]+dl[j]][c[p]+dc[j]]>=mid&&x[l[p]+dl[j]][c[p]+dc[j]]!=0){
                        x[l[p]+dl[j]][c[p]+dc[j]]=0;
                        u++;
                        l[u]=l[p]+dl[j];
                        c[u]=c[p]+dc[j];}

                    p++;}
            if (x[l2][c2]==0) {
                sol=mid;
                st=mid+1;
                }
            else dr=mid-1;
            }
fprintf(g,"%d\n",sol);
return 0;
}