Cod sursa(job #1119071)

Utilizator TudorMTudor Moldovanu TudorM Data 24 februarie 2014 14:59:03
Problema Castel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include<fstream>
using namespace std;
ifstream f("castel.in");
ofstream g("castel.out");
int a[151][151], nr, b[151][151],maxi,dx[]={-1,0,1,0},m,n,k, dy[]={0,1,0,-1},fr[10000],l1,col1;
struct{int x, y;}c[20000];
struct{int nord,est,sud,vest;}patrat[150][150];
int interior(int x, int y)
{
    if(x>=1&&x<=m&&y>=1&&y<=n)return 1;
    return 0;
}
void citire()
{
    int i, j;
    f>>m>>n>>k;
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;j++)
        {
            f>>a[i][j];
            b[i][j]=++nr;
            if(nr==k)
            {
                l1=i;
                col1=j;
            }
        }
    }
}
int posibil(int x, int y, int xv, int yv, int i)
{
    if(i==0&&patrat[x][y].nord==1)return 0;
    if(i==1&&patrat[x][y].est==1)return 0;
    if(i==2&&patrat[x][y].sud==1)return 0;
    if(i==3&&patrat[x][y].vest==1)return 0;
    return 1;
}
void lee(int x, int y)
{
    int i, j, xv, yv, p, u;
    p=u=1;
    fr[b[x][y]]=1;
    c[u].x=x;
    c[u].y=y;
    while(p<=u)
    {
        x=c[p].x;
        y=c[p++].y;
        for(i=0;i<=3;i++)
        {
            xv=x+dx[i];
            yv=y+dy[i];
            if(interior(xv,yv)&&fr[a[xv][yv]]&&posibil(x,y,xv,yv,i))
            {
                fr[b[xv][yv]]=1;
                c[++u].x=xv;
                c[u].y=yv;
                if(i==0)
                {
                    patrat[x][y].nord=1;
                    patrat[xv][yv].sud=1;
                }
                else if(i==1)
                {
                    patrat[x][y].est=1;
                    patrat[xv][yv].vest=1;
                }
                else if(i==2)
                {
                    patrat[x][y].sud=1;
                    patrat[xv][yv].nord=1;
                }
                else
                { patrat[x][y].vest=1;
                patrat[xv][yv].est=1;
                }
            }
        }
    }
}
int main()
{
    citire();
    lee(l1,col1);
    int i;
    for(i=1;i<=nr;i++)if(fr[i])maxi++;
    g<<maxi;
    f.close();
    g.close();
    return 0;
}