Cod sursa(job #1966469)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 15 aprilie 2017 12:01:48
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<fstream>
#include<vector>
#define f first
#define s second
using namespace std;
int n, m, k, i, j, ii, jj, iv, jv, d, sol, p, u, x;
int a[155][155], viz[155][155];
pair<int, int> c[155 * 155], ind[155 * 155], vec;
vector<int> v[155 * 155];
int di[4] = {-1, 1, 0, 0};
int dj[4] = {0, 0, -1, 1};
ifstream fin("castel.in");
ofstream fout("castel.out");
int main(){
    fin>> n >> m >> k;
    for(i = 1; i <= n; i++){
        for(j = 1; j <= m; j++){
            fin>> a[i][j];
            ind[(i - 1) * m + j].f = i;
            ind[(i - 1) * m + j].s = j;
        }
    }
    p = u = 1;
    c[1] = ind[k];
    viz[ ind[k].f ][ ind[k].s ] = 1;
    while(p <= u){
        ii = c[p].f;
        jj = c[p].s;
        x = (ii - 1) * m + jj;
        for(i = 0; i < v[x].size(); i++){
            vec = ind[ v[x][i] ];
            if(viz[vec.f][vec.s] == 0){
                viz[vec.f][vec.s] = 1;
                c[++u] = vec;
            }
        }
        for(d = 0; d < 4; d++){
            iv = ii + di[d];
            jv = jj + dj[d];
            if(viz[iv][jv] == 0 && iv > 0 && jv > 0 && iv <= n && jv <= m){
                vec = ind[ a[iv][jv] ];
                if(viz[vec.f][vec.s] == 1){
                    viz[iv][jv] = 1;
                    c[++u] = make_pair(iv, jv);
                }
                else{
                    v[ a[iv][jv] ].push_back((iv - 1) * m + jv);
                }
            }
        }
        p++;
    }
    for(i = 1; i <= n; i++){
        for(j = 1; j <= m; j++){
            sol += viz[i][j];
        }
    }
    fout<< sol <<"\n";
    return 0;
}