Cod sursa(job #797151)

Utilizator alexclpAlexandru Clapa alexclp Data 13 octombrie 2012 15:10:04
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>
#include <iostream>
#include <queue>

#define N 1005

using namespace std;

ifstream in ("barbar.in");
ofstream out ("barbar.out");

struct Pozitie {
    int x;
    int y;
};

queue <Pozitie> coada;

char map[N][N];
int drumDragoni[N][N];
int dirX[] = {-1, 0, 1, 0};
int dirY[] = {0, 1, 0, -1};
int n, m;
Pozitie start;
Pozitie final;

void bordare()
{
    for (int i = 0; i <= n+1; i++) {
        drumDragoni[i][0] = drumDragoni[i][m+1] = -1;
    }
    for (int j = 0; j <= m+1; j++) {
        drumDragoni[0][j] = drumDragoni[n+1][j] = -1;
    }
}


void leeDragoni()
{
    //coada.push(start);
    //drumDragoni[start.x][start.y] = 1;

    while (!coada.empty()) {
        Pozitie curent = coada.front();
        coada.pop();

        //cout << "\nscot " << curent.x << " " << curent.y << "\n\n";

        for (int i = 0; i < 4; i++) {
            int x = curent.x + dirX[i];
            int y = curent.y + dirY[i];

            if (drumDragoni[x][y] == 0) {
                drumDragoni[x][y] = drumDragoni[curent.x][curent.y] + 1;
                coada.push((Pozitie){x,y});
                //cout << "adaug " << x << " " << y << "\n";
                //if(x==0 || y==0)
                {
                    //return;
                }
            }
        }
    }

}


int main()
{
    in >> n >> m ;

    for (int i = 1; i <= n; i++) {
        in.getline(1 + map[i], N);
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (map[i][j] == 'I') {
                start.x = i;
                start.y = j;
                continue;
            }
            if (map[i][j] == '*') {
                drumDragoni[i][j] = -1;

                continue;
            }
            if (map[i][j] == 'O') {
                final.x = i;
                final.y = j;

                continue;
            }
            if (map[i][j] == 'D') {
                drumDragoni[i][j] = 1;
                coada.push((Pozitie){i,j});


                continue;
            }
        }
    }

    bordare();
    leeDragoni();
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
           cout << drumDragoni[i][j] << " ";
        }
        cout << "\n";
    }

    return 0;
}