Cod sursa(job #1384362)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 11 martie 2015 01:56:29
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <cstdio>
#include <vector>
#define NMAX 157
FILE *fin, *fout;
using namespace std;
int m, n, k, arr[NMAX][NMAX], x, y, poz, temp, size, countn = 0;
bool check[NMAX][NMAX], check1[NMAX][NMAX];
vector<int> vx[NMAX*NMAX], vy[NMAX*NMAX];
struct queue
{
       int x1;
       int y1;
} q[NMAX*NMAX];
int main()
{
    fin = freopen("castel.in", "r", stdin);
    fout = freopen("castel.out", "w", stdout);
    scanf("%d%d%d", &m, &n, &k);
    for(int i = 1; i<= m; i++)
    {
            for(int j = 1; j<= n; j++)
            {
                    scanf("%d", &arr[i][j]);
                    vx[arr[i][j]].push_back(i);
                    vy[arr[i][j]].push_back(j);
            }
    }
    x = (k-1)%n + 1;
    y = (k-1)/n + 1;
    check[x][y] = 1;
    check1[x][y] = 1;
    q[0].x1 = x;
    q[0].y1 = y;
    poz = 1;
    for(int i = 0; i< poz; i++)
    {
            temp = (q[i].x1-1)*n + q[i].y1;
            size = vx[temp].size();
            for(int j = 0; j< size; j++)
            {
                    check[vx[temp][j]][vy[temp][j]] = 1;
            }
            if(check1[q[i].x1+1][q[i].y1] == 0 && check[q[i].x1+1][q[i].y1] == 1)
            {
                                          q[poz].x1 = q[i].x1 + 1;
                                          q[poz].y1 = q[i].y1;
                                          check1[q[poz].x1][q[poz].y1] = 1;
                                          poz++;
            }
            if(check1[q[i].x1-1][q[i].y1] == 0 && check[q[i].x1-1][q[i].y1] == 1)
            {
                                          q[poz].x1 = q[i].x1 - 1;
                                          q[poz].y1 = q[i].y1;
                                          check1[q[poz].x1][q[poz].y1] = 1;
                                          poz++;
            }
            if(check1[q[i].x1][q[i].y1+1] == 0 && check[q[i].x1][q[i].y1+1] == 1)
            {
                                          q[poz].x1 = q[i].x1;
                                          q[poz].y1 = q[i].y1 + 1;
                                          check1[q[poz].x1][q[poz].y1] = 1;
                                          poz++;
            }
            if(check1[q[i].x1][q[i].y1-1] == 0 && check[q[i].x1][q[i].y1-1] == 1)
            {
                                          q[poz].x1 = q[i].x1;
                                          q[poz].y1 = q[i].y1 - 1;
                                          check1[q[poz].x1][q[poz].y1] = 1;
                                          poz++;
            }
    }
    for(int i = 1; i<= m; i++)
    {
            for(int j = 1; j<= n; j++)
            {
                    countn+=check1[i][j];
            }
    }
    printf("%d\n", countn);
    fclose(fin);
    fclose(fout);
    return 0;
}