Cod sursa(job #932045)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 28 martie 2013 17:49:20
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("castel.in");
ofstream fout("castel.out");

void Afisare();

int n, m, k, li, ci, a[155][155], b[155][155], nrcam[155][155], nrc = 1;
bool fr[23000];
short l[300000], c[300000];

const int di[] = {1, -1, 0, 0},
          dj[] = {0, 0, 1, -1};

void Citire(){
    int camere = 0;
    fin>>n>>m>>k;
    for(int i=1; i<=n;i++)
        for(int j=1; j<=m;j++){
            fin>>a[i][j];
            nrcam[i][j] = ++camere;
            if(camere == k) li = i, ci = j;
        }
}

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

void Lee(){
    int st = 1, dr = 1;
    l[1] = li, c[1] = ci;
    b[li][ci] = 1;
    fr[k] = 1;
    while(st <= dr){
        int i = l[st], j = c[st];
        for(int k=0; k<4; k++){
            int ii = i + di[k], jj = j + dj[k];
            if(b[ii][jj] != -1 && nrc > b[ii][jj] && fr[a[ii][jj]]){
                if(b[ii][jj] == 0) nrc++, fr[nrcam[ii][jj]] = 1;
                dr++;
                l[dr] = ii, c[dr] = jj,
                b[ii][jj] = nrc;
            }
        }
        st++;
    }
}

int main()
{
    Citire();
    Bordare();
    Lee();
    fout<<nrc;
    //Afisare();
    return 0;
}

void Afisare(){
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++)
            fout<<b[i][j]<<" ";
        fout<<'\n';
    }

    fout<<endl;

    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++)
            fout<<a[i][j]<<" ";
        fout<<'\n';
    }
}