Cod sursa(job #2268909)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 25 octombrie 2018 15:12:55
Problema Castel Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <iostream>
#include <queue>
#include <fstream>
using namespace std;
ifstream f("castel.in");
ofstream g("castel.out");
const short vi[5] = {-1, 0, 1, 0}, vj[5] = {0, 1, 0, -1};
int a[155][155];
int n, m, k;
bool ok;
int nrCam = 1;
bool chei[22505];
queue<pair<int, int > > Q;

void lee()
{
    int Starti=(k-1)/m+1;
    int Startj=(k-1)%m+1;
    a[Starti][Startj] = -1;
    Q.push(make_pair(Starti, Startj));
    int Condi = 0, Condj = 0;
    ok = 0;
    while(!Q.empty())
    {
        int i = Q.front().first;
        int j = Q.front().second;
        if(i == Condi && j == Condj)
        {
            if(ok == 0)
                return;
            else
            {
                Condi = 0;
                Condj = 0;
                ok = 0;            }
        }
        int nrMinus = 0;
        Q.pop();
        for(int v = 0; v<4; v++)
        {
            int iv = i+vi[v];
            int jv = j+vj[v];
            int camera = (iv-1)*m+jv;
            if(a[iv][jv] != -1)
            {
                if(chei[a[iv][jv]])
                {
                    a[iv][jv] = -1;
                    if(chei[camera] == 0)
                    {
                        ok = 1;
                        nrCam++;
                        chei[camera] = 1;
                    }
                    Q.push(make_pair(iv, jv));
                    nrMinus++;
                }
            }
            else
                nrMinus++;
        }
        if(nrMinus<4)
        {
            if(Condi == 0)
            {
                Condi = i;
                Condj = j;
            }
            Q.push(make_pair(i, j));
        }
    }
}

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

void citire()
{
    f>>n>>m>>k;
    chei[k] = 1;
    chei[0] = 1;
    for(int i = 1; i<=n; i++)
    {
        for(int j = 1; j<=m; j++)
        {
            f>>a[i][j];
        }
    }
}

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

void rez()
{
    lee();
    g<<nrCam;
}

void afis()
{
    for(int i = 0; i<=n+1; i++)
    {
        for(int j = 0; j<=m+1; j++)
        {
            g<<a[i][j]<<" ";
        }
        g<<"\n";
    }
}

int main()
{
    citire();
    bordare();
    //afis();
    rez();
    return 0;
}