Cod sursa(job #726591)

Utilizator stefanzzzStefan Popa stefanzzz Data 27 martie 2012 12:41:42
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;

ifstream f("castel.in");
ofstream g("castel.out");

int n,m,k,x,cnt,cheie[22505],lg;
bool viz[22505],uz[22505];
queue<int> q;
vector<int> acces[22505];


int main(){
    int i,j;
    f>>n>>m>>k;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++)
            f>>cheie[++cnt];}
    cnt=1;
    viz[k]=uz[k]=1;
    q.push(k);
    while(!q.empty()){
        x=q.front();
        q.pop();
        for(i=0;i<acces[x].size();i++){
            cnt++;
            viz[acces[x][i]]=1;
            q.push(acces[x][i]);}
        if((x+1)%m!=1&&!uz[x+1]){
            uz[x+1]=1;
            if(viz[cheie[x+1]]){
                cnt++;
                viz[x+1]=1;
                q.push(x+1);}
            else
                acces[cheie[x+1]].push_back(x+1);}
        if((x-1)%m&&!uz[x-1]){
            uz[x-1]=1;
            if(viz[cheie[x-1]]){
                cnt++;
                viz[x-1]=1;
                q.push(x-1);}
            else
                acces[cheie[x-1]].push_back(x-1);}
        if((x+m-1)/m<n&&!uz[x+m]){
            uz[x+m]=1;
            if(viz[cheie[x+m]]){
                cnt++;
                viz[x+m]=1;
                q.push(x+m);}
            else
                acces[cheie[x+m]].push_back(x+m);}
        if(x-m>0&&!uz[x-m]){
            uz[x-m]=1;
            if(viz[cheie[x-m]]){
                cnt++;
                viz[x-m]=1;
                q.push(x-m);}
            else
                acces[cheie[x-m]].push_back(x-m);}}
    g<<cnt;
    f.close();
    g.close();
    return 0;}