Cod sursa(job #1971863)

Utilizator gruhtenZinnenberg Gruhten gruhten Data 21 aprilie 2017 10:22:40
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb

/**************************************************************/
//program preluat de la Mihai Bendeac ONI2015 si modificat
#include <iostream>
#include <fstream>
#define NMax 155
//#define NMax 5
using namespace std;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int N,M,K,ok,nr,nr_accesibile,k;
bool cheie[NMax*NMax];
int A[NMax][NMax],B[NMax][NMax];
int i,j;
//int Vx,Vy;

int Cx[NMax*NMax],Cy[NMax*NMax];
int l9,c9;
struct locatie
{
    int x,y;
}start;

void Citire()
{
    ifstream f("castel.in");
    f>>N>>M>>K;
    for(i=1;i<=N;i++)
     for(j=1;j<=M;j++)
     {
        nr++;
        f>>A[i][j];  //A[] tine minte cheile  si se transforma in -1 daca e accesibila camera
        B[i][j]=nr;  //B tine minte nr. camerei
     }
}

void Afisare()
{
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=M;j++)
            cout<<A[i][j]<<' ';
        cout<<endl;
    }
}

//inline bool Posibil(int x,int y)
//{
//    if(x>=1 && y>=1 && x<=N && y<=M)
//        return true;
//    return false;
//}

void calcul()
{
    //cheie[A[start.x][start.y]]=1;
    start.x=K/M; //K e nr. camerei de start
    start.y=K%M;
    if(start.y>0) ++start.x;
    if(start.y==0) start.y=M;

    cheie[B[start.x][start.y]]=1;
    ok=1,nr=0,nr_accesibile=1;
    A[start.x][start.y]=-1;

    Cx[0]=start.x;
    Cy[0]=start.y;
    while(ok==1)
    {
        ok=0;
        for(i=0;i<=nr;i++)
        {
            for(k=0;k<4;k++)
            {
                l9= Cx[i]+dx[k];
                c9= Cy[i]+dy[k];
                if(A[l9][c9]!=-1)//daca nu e deja deschisa camera
                 if(cheie[A[l9][c9]]==1) //daca este cheie pt camera respectiva
                 {
                    nr++;
                    Cx[nr]=l9;
                    Cy[nr]=c9;
                    A[l9][c9]=-1; //marcam o camera accesibila
                    cheie[B[l9][c9]]=1; //gasesc o cheie cu numarul camerei deschise
                    nr_accesibile++;
                    ok=1;
                 }
            }
        }
    }
}

int main()
{
    Citire();
    calcul();
    ofstream g("castel.out");
    g<<nr_accesibile;
    //Afisare();
}

/**************************************************************/