Cod sursa(job #1811136)

Utilizator stefanmereutaStefan Mereuta stefanmereuta Data 20 noiembrie 2016 21:12:34
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.61 kb
#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

#define MAX 1000

struct celula {
    int x, y;
};

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;
    char m[MAX][MAX], check[MAX][MAX] = {0};    //0 = nevizitat, 1 = liber, 2 = perete/dragon

    celula start, iesire;

    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') {
                start.x = i;
                start.y = j;

                m[i][j] = '.';
            } else if (m[i][j] == 'O') {
                iesire.x = i;
                iesire.y = j;

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

    check[start.x][start.y] = 1;

    ver(m, check, R, C, start.x, start.y);

    if (check[iesire.x][iesire.y] == 0) {
        fout << -1;

        return 0;
    }

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

        check[start.x][start.y] = 1;

        peretificare(m, R, C, dist);

        ver(m, check, R, C, start.x, start.y);

        if (check[iesire.x][iesire.y] != 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++;
                }
            }
        }
    }
}