Cod sursa(job #1183049)

Utilizator xtreme77Patrick Sava xtreme77 Data 8 mai 2014 13:50:38
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <cstdio>
#include <queue>
#include <cstring>
#define MAX 1111
#define GOL -2
#define POM -1
#define DRG 0
using namespace std;
struct lee{
    int x,y;
};
lee start,finish;
inline lee build(int i,int j){
    lee a;
    a.x=i;
    a.y=j;
    return a;
}
queue <lee> coada;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int n,m;
int mat[MAX][MAX];
bool uz[MAX][MAX];
void citire();
void init_mat(int matrice[MAX][MAX],int n,int m,int q);
void bordez(int matrice[MAX][MAX],int n,int m);
void build_lee();
int cautarea_smechera_binara_a_lui_Petrascu();
bool inline check(int p);
void afis();
int main()
{
    citire();
    build_lee();
    afis();
    return 0;
}
void citire(){
    char ch;
    freopen("barbar.in","r",stdin);
    scanf("%d%d\n",&n,&m);
    init_mat(mat,n,m,GOL);
    bordez(mat,n,m);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            scanf("%c",&ch);
            if (ch=='*')mat[i][j]=POM;
                else if (ch=='.')mat[i][j]=GOL;
                    else if (ch=='D')mat[i][j]=DRG,coada.push(build(i,j));
                        else if (ch=='O')finish.x=i,finish.y=j;
                            else start.x=i,start.y=j;
        }
        scanf("%c",&ch);
    }
}
void init_mat(int matrice[MAX][MAX],int n,int m,int q){
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            matrice[i][j]=q;
}
void bordez(int matrice[MAX][MAX],int n,int m){
    for(int i=0;i<=n+1;i++)mat[i][0]=mat[i][m+1]=POM;
    for(int j=0;j<=m+1;j++)mat[0][j]=mat[n+1][j]=POM;
}
void build_lee(){
    int temp_x,temp_y;
    while(!coada.empty()){
        temp_x=coada.front().x;
        temp_y=coada.front().y;
        for(int i=0;i<=3;++i)
            if(mat[temp_x+dx[i]][temp_y+dy[i]]==GOL){
                mat[temp_x+dx[i]][temp_y+dy[i]]=mat[temp_x][temp_y]+1;
                coada.push(build(temp_x+dx[i],temp_y+dy[i]));
            }
        coada.pop();
    }
}
bool inline check(int p){
    if(mat[start.x][start.y]==GOL)return 1;
    if(mat[start.x][start.y]<p)return 0;
    coada.push(start);
    memset(uz,0,sizeof(uz));
    uz[start.x][start.y]=1;
    int temp_x,temp_y;
    while(!coada.empty()){
        temp_x=coada.front().x;
        temp_y=coada.front().y;
        for(int i=0;i<=3;++i)
            if(mat[temp_x+dx[i]][temp_y+dy[i]]>=p and !uz[temp_x+dx[i]][temp_y+dy[i]]){
                uz[temp_x+dx[i]][temp_y+dy[i]]=1;
                coada.push(build(temp_x+dx[i],temp_y+dy[i]));
            }
        coada.pop();
    }
    return uz[finish.x][finish.y];
}
int cautarea_smechera_binara_a_lui_Petrascu(){
    int i, step;
    for (step=1;step<n*m; step <<= 1);
    for (i=0;step;step>>= 1)
        if (i+step<=n*m and check(i+step))
           i += step;
    if(!i)return -1;
    return i;
}
void afis(){
    freopen("barbar.out","w",stdout);
    printf("%d\n",cautarea_smechera_binara_a_lui_Petrascu());
}