Cod sursa(job #1048053)

Utilizator cypy2474alupei ciprian cypy2474 Data 5 decembrie 2013 11:00:36
Problema Castel Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<fstream>
using namespace std;
int n,m,k;
int v[155][155];
int vtf[155][155];
int key[22505];
int v1[22505],k1;
int v2[22505],k2;

void wtf(int a)
{
    int x=a/m,y=a%m;
    if (x-1>-1)
        if (vtf[x-1][y]>-2)
            if (key[v[x-1][y]])
            {
                vtf[x-1][y]=-2;
                v1[k1++]=(x-1)*m+y;
                key[(x-1)*m+y]=1;
            }
            else
                if (vtf[x-1][y]>-1)
                {
                    vtf[x-1][y]=-1;
                    v2[k2++]=(x-1)*m+y;
                }
    if (x+1<n)
        if (vtf[x+1][y]>-2)
            if (key[v[x+1][y]])
            {
                vtf[x+1][y]=-2;
                v1[k1++]=(x+1)*m+y;
                key[(x+1)*m+y]=1;
            }
            else
                if (vtf[x+1][y]>-1)
                {
                    vtf[x+1][y]=-1;
                    v2[k2++]=(x+1)*m+y;
                }
    if (y-1>-1)
        if (vtf[x][y-1]>-2)
            if (key[v[x][y-1]])
            {
                vtf[x][y-1]=-2;
                v1[k1++]=x*m+y-1;
                key[x*m+y-1]=1;
            }
            else
                if (vtf[x][y-1]>-1)
                {
                    vtf[x][y-1]=-1;
                    v2[k2++]=x*m+y-1;
                }
    if (y+1<m)
        if (vtf[x][y+1]>-2)
            if (key[v[x][y+1]])
            {
                vtf[x][y+1]=-2;
                v1[k1++]=x*m+y+1;
                key[x*m+y+1]=1;
            }
            else
                if (vtf[x][y+1]>-1)
                {
                    vtf[x][y+1]=-1;
                    v2[k2++]=x*m+y+1;
                }
}

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

    int i,j;

    f>>n>>m>>k;
    for (i=0; i<n; i++)
        for (j=0; j<m; j++)
        {
            f>>v[i][j];
            v[i][j]--;
        }
    k--;
    key[k]=1; v1[0]=k; k1=1; k2=0; i=0; j=0;
    vtf[k/m][k%m]=-2;

    while (i<k1 || j<k2)
    {
        if (i<k1)
        {
            wtf(v1[i]);
            i++;
        }
        else
        {
            if (key[ v[v2[j]/m][v2[j]%m] ])
            {
                v1[k1++]=v2[j];
                vtf[v2[j]/m][v2[j]%m]=-2;
                key[v2[j]]=1;
            }
            j++;
        }
    }

    int s=0;
    for (i=0; i<n; i++)
        for (j=0; j<m; j++)
            if (vtf[i][j]==-2)
                s++;

    g<<s;

    return 0;
}