Cod sursa(job #2146952)

Utilizator EdgeLordXDOvidiuPita EdgeLordXD Data 28 februarie 2018 12:43:13
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
#define N 10001
int a[N][N];
short dx[4]={0,1,0,-1};
short dy[4]={1,0,-1,0};
short n,m;
bool b[N][N];
int q[N*N][2];
short x,y,x2,y2;
void fil(int i, int j,int k){
    if(i<1 || i>n || j<1 || j>m || a[i][j]<k || b[i][j] || a[i][j]==-1);
    else{
        b[i][j]=1;
        if(i==x2 && j==y2)
            return;
        fil(i+1,j,k);
        fil(i,j+1,k);
        fil(i-1,j,k);
        fil(i,j-1,k);
    }
}
int main(){
    int i,j;
    in>>n>>m;
    short u=0, p=0;
    char ch;
    for(i=1; i<=n; ++i){
        for(j=1; j<=m; ++j){
            in>>ch;
            switch(ch){
                case 'I': x=i, y=j; break;
                case 'O': x2=i, y2=j; break;
                case '0': x2=i, y2=j; break;
                case '*': a[i][j]=-1, b[i][j]=1; ; break;
                case 'D': q[++u][0]=i, q[u][1]=j, a[i][j]=1; break;
            }
        }
    }
    for(i=0; i<=m+1; ++i)
        a[0][i]=a[n+1][i]=-1;
    for(i=0; i<=n+1; ++i)
        a[i][0]=a[i][m+1]=-1;
    short c1,c2,v1,v2;
    int maxx=0;
    while(p<=u){
        c1=q[++p][0];
        c2=q[p][1];
        for(i=0; i<4; ++i){
            v1=c1+dx[i];
            v2=c2+dy[i];
            if(!a[v1][v2]){
                a[v1][v2]=a[c1][c2]+1;
                maxx=max(maxx,a[v1][v2]);
                q[++u][0]=v1;
                q[u][1]=v2;
            }
        }
    }
    int k;
    for(i=maxx; i>=1; --i){
        for(j=1; j<=n; ++j)
            for(k=1; k<=m; ++k)
                b[j][k]=0;
        fil(x,y,i);
        if(b[x2][y2]){
            out<<i-1;
            return 0;
        }
    }
    out<<-1;
    return 0;
}