Cod sursa(job #1899149)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 2 martie 2017 15:58:22
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream f ("castel.in");
ofstream g ("castel.out");
queue <int> qy;
queue <int> qx;
int n,m,st,dr,v[151][151],x,y,cx,cy,dx[]={-1,0,1,0},dy[]={0,1,0,-1},cheie[150*150+1],final=1,t;
bool viz[151][151];
struct
{
    int a,b,go;
}room[150*150];
bool apartine(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m;
}
int cod(int x,int y)
{
    int nr=0;
    if(y%m==0) nr=x*m;
    else nr=y%m+(x-1)*m;
    return nr;
}
void read()
{
    f>>n>>m>>st;
    cheie[st]=1;
    dr=st%m;
    viz[st][dr]=1;
    if(!dr) {dr=m;--st;}
    st=st/n+1;
    qx.push(st);
    qy.push(dr);
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j) f>>v[i][j];
    }
}
void lee()
{
    while(!qx.empty())
    {
        x=qx.front();
        y=qy.front();
        //g<<x<<' '<<y<<'\n';
        qx.pop();
        qy.pop();
        for(int i=0;i<4;++i)
        {
            cx=x+dx[i];
            cy=y+dy[i];
            if(!viz[cx][cy]&&apartine(cx,cy))
            {
                if(cheie[v[cx][cy]])
                {
                    ++final;
                    qx.push(cx);
                    qy.push(cy);
                    viz[cx][cy]=1;
                    cheie[cod(cx,cy)]=1;
                    //g<<cod(cx,cy)<<'\n';
                    for(int j=1;j<=t;++j)
                    {
                        if(!viz[room[j].a][room[j].b]&&cheie[room[j].go])
                        {
                            ++final;
                            viz[room[j].a][room[j].b]=1;
                            qx.push(room[j].a);
                            qy.push(room[j].b);
                        }
                    }
                }
                else
                {
                    ++t;
                    room[t].a=cx;
                    room[t].b=cy;
                    room[t].go=v[cx][cy];
                }
            }
        }
    }
}
int main()
{
    read();
    lee();
    g<<final;
    //g<<cod(2,1);
    return 0;
}