Cod sursa(job #1811416)

Utilizator stefanmereutaStefan Mereuta stefanmereuta Data 21 noiembrie 2016 11:01:29
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.53 kb
#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

#define MAX 1000

void step(char m[MAX][MAX], char check[MAX][MAX], int R, int C, int x, int y, int newx, int newy);

void ver(char m[MAX][MAX], char check[MAX][MAX], int R, int C, int x, int y);

void peretificare(char m[MAX][MAX], int R, int C, int dist);

int main()
{
   ifstream fin("barbar.in");
   ofstream fout("barbar.out");

   int R, C, dist, i_start, j_start, i_iesire, j_iesire;
   char m[MAX][MAX], check[MAX][MAX] = {0};

   fin >> R >> C;

   for (int i = 0; i < R; i++) {
       for (int j = 0; j < C; j++) {
           fin >> m[i][j];

           if (m[i][j] == 'I') {
               i_start = i;
               j_start = j;

               m[i][j] = '.';
           } else if (m[i][j] == 'O') {
               i_iesire = i;
               j_iesire = j;

               m[i][j] = '.';
           }
       }
   }

   check[i_start][j_start] = 1;

   ver(m, check, R, C, i_start, j_start);

   if (check[i_iesire][j_iesire] == 0) {
       fout << -1;

       return 0;
   }

   for (dist = 1; dist < MAX; dist++) {
       peretificare(m, R, C, dist);

       for (int i = 0; i < R; i++) {
           for (int j = 0; j < C; j++) {
               check[i][j] = 0;
           }
       }

       if (m[i_start][j_start] != '*') {
            check[i_start][j_start] = 1;
        } else {
            break;
        }

       ver(m, check, R, C, i_start, j_start);

       if (check[i_iesire][j_iesire] != 1) {
           break;
       }
   }

   fout << dist;

   fin.close();
   fout.close();
   return 0;
}

void step(char m[MAX][MAX], char check[MAX][MAX], int R, int C, int x, int y, int newx, int newy) {
   if (check[newx][newy] == 0) {
       if (m[newx][newy] == 'D' || m[newx][newy] == '*') {
           check[newx][newy] = 2;
       } else {
           check[newx][newy] = 1;
           ver(m, check, R, C, newx, newy);
       }
   }
}

void ver(char m[MAX][MAX], char check[MAX][MAX], int R, int C, int x, int y) {
   if (x < C - 1) {
       step(m, check, R, C, x, y, x + 1, y);
   }

   if (y < R - 1) {
       step(m, check, R, C, x, y, x, y + 1);
   }

   if (x >= 1) {
       step(m, check, R, C, x, y, x - 1, y);
   }

   if (y >= 1) {
       step(m, check, R, C, x, y, x, y - 1);
   }
}

void peretificare(char m[MAX][MAX], int R, int C, int dist) {
   for (int i = 0; i < R; i++) {
       for(int j = 0; j < C; j++) {
           if (m[i][j] == 'D') {
               int ki = i - dist, kj = j;

               while (ki < i) {
                   if (ki >= 0 && kj <= C - 1 && m[ki][kj] == '.') {
                       m[ki][kj] = '*';
                   }

                   ki++;
                   kj++;
               }

               while (kj > j) {
                   if (ki <= R - 1 && kj <= C - 1 && m[ki][kj] == '.') {
                       m[ki][kj] = '*';
                   }

                   ki++;
                   kj--;
               }

               while (ki > i) {
                   if (ki <= R - 1 && kj >= 0 && m[ki][kj] == '.') {
                       m[ki][kj] = '*';
                   }

                   ki--;
                   kj--;
               }

               while (kj < j) {
                   if (ki >= 0 && kj >= 0 && m[ki][kj] == '.') {
                       m[ki][kj] = '*';
                   }

                   ki--;
                   kj++;
               }
           }
       }
   }
}