Cod sursa(job #1654456)

Utilizator braisaMiron Raisa braisa Data 17 martie 2016 02:54:11
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>
#include <algorithm>
#include <climits>
 
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
 
struct point{
        int x,y;
} I,O,C[4000000];
 
const int dx[4] = {1,0,-1,0},
          dy[4] = {0,1,0,-1};
           
int A[1100][1100],N,M,l,r,rs,step;
bool B[1100][1100];
string S;
 
void Lee(){
    l = 1;
    while(r >= l){
        for(int i = 0;i<4;i++){
            int x = C[l].x + dx[i];
            int y = C[l].y + dy[i];
            if(A[x][y] > A[C[l].x][C[l].y]+1){
                A[x][y] = A[C[l].x][C[l].y]+1;
                C[++r].x = x;
                C[r].y = y;
            }
        }
        l++;
    }
}
 
bool check(int val){
    if(A[I.x][I.y] < val) return false;
    r = l = 1;
    C[r].x = I.x;
    C[r].y = I.y;
    B[I.x][I.y] = 1;
     
    while(r >= l){
        for(int i = 0;i<4;i++){
            int x = C[l].x + dx[i];
            int y = C[l].y + dy[i];
            if(A[x][y] >= val && !B[x][y]){
                if(O.x == x && O.y == y){
                        for(int j = 1;j<=r;j++) B[C[j].x][C[j].y] = 0;
                        return true;
                }
                C[++r].x = x;
                C[r].y = y;
                B[x][y] = 1;
            }
        }
        l++;
    }
    for(int j = 1;j<=r;j++) B[C[j].x][C[j].y] = 0;
    return false;
}
 
int main(){
    fin >> N >> M;
    getline(fin,S);
    for(int i = 1;i<=N;i++) A[i][0] = -1; 
    for(int i = 1;i<=M;i++) A[0][i] = -1;
    for(int i = 1;i<=N;i++) A[i][M+1] = -1;
    for(int i = 1;i<=M;i++) A[N+1][i] = -1;
    for(int i = 1;i<=N;i++){
        getline(fin,S);
        for(int j = 0;j<int(S.length());j++){
                A[i][j+1] = INT_MAX;
                if(S[j] == '*') A[i][j+1] = -1;
                else
                if(S[j] == 'D') C[++r].x = i,C[r].y = j+1, A[i][j+1] = 0;
                else
                if(S[j] == 'I') I.x = i, I.y = j+1;
                else
                if(S[j] == 'O') O.x = i, O.y = j+1; 
        }
    }
    Lee();
    step = 1024;
    for(rs = 0;step;step>>=1)
            if(check(rs+step)) rs+=step;
 
    if(rs) fout << rs;
    else if(check(0)) fout << 0; else fout << -1;
     
        return 0;
}