Cod sursa(job #1268152)

Utilizator smaraldaSmaranda Dinu smaralda Data 20 noiembrie 2014 17:39:43
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;

#define ITERATOR vector<int>::iterator
const int NMAX = 155;

queue <int> q;
int n, m, grid[NMAX][NMAX], di[] = {-1, 0, 1, 0}, dj[] = {0, 1, 0, -1};
bool vis[NMAX * NMAX];

void decode (int x, int &i, int &j) {
    i = x / m;
    j = x % m;
    if(j == 0)
        j = m;
    else
        ++ i;
}

int code (int i, int j) {
    return (i - 1) * m + j;
}

bool inBound (int i, int j) {
    return i >= 1 && j >= 1 && i <= n && j <= m;
}

int main() {
    freopen("castel.in", "r", stdin);
    freopen("castel.out", "w", stdout);
    int i, j, room, cnt, k, newi, newj, change;

    scanf("%d%d%d", &n, &m, &room);
    for(i = 1; i <= n; ++ i)
        for(j = 1; j <= m; ++ j)
            scanf("%d", &grid[i][j]);

    vis[room] = 1;
    change = 1;
    while(change) {
        change = 0;
        for(i = 1; i <= n; ++ i)
            for(j = 1; j <= m; ++ j)
                if(vis[code(i, j)]) {
                    for(k = 0; k < 4; ++ k) {
                        newi = i + di[k];
                        newj = j + dj[k];
                        if(inBound(newi, newj) && !vis[code(newi, newj)] && vis[grid[newi][newj]])
                            change = 1,
                            vis[code(newi, newj)] = 1;
                    }
                }
    }

    cnt = 0;
    for(i = 1; i <= n * m; ++ i)
        if(vis[i])
            ++ cnt;

    printf("%d\n", cnt);
    return 0;
}