Cod sursa(job #430329)

Utilizator funkydvdIancu David Traian funkydvd Data 30 martie 2010 22:04:52
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<fstream>
#include<queue>
#include<vector>
#define baga_la_sfarsit push_back
#define fa_pereche make_pair
#define baga push
#define prim first
#define secund second
#define PII pair<int,int>
#define pentru(i,a,n)   for(int i=a;i<=n;++i)
#define PENTRU for
#define cat_timp while
#define daca if
#define altfel else
#define coada queue
#define numar_intreg int
#define goala empty
#define fata front
#define sterge pop
# define nu_e !
using namespace std;
ifstream f("castel.in");
ofstream g("castel.out");
numar_intreg n,m,k,s;
numar_intreg dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
numar_intreg a[152][152],marc[152][152],cheie[152*152];
vector<PII> K[152*152];
coada<PII> Q;
void citire()
{
	f>>n>>m>>k;
	pentru(i,1,n)
		pentru(j,1,m) f>>a[i][j];
}
void bordare()
{
	pentru(i,1,n) a[i][0]=a[i][m+1]=n*m+1;
    pentru(i,1,m) a[0][i]=a[n+1][i]=n*m+1;
}
void fa (numar_intreg x, numar_intreg y)
{
	k=(x-1)*m+y;
	cheie[k]=1;
	PENTRU (vector<pair<int,int> >::iterator it=K[k].begin();it!=K[k].end();++it)
		marc[it->prim][it->secund]=2,Q.baga(*it);
	K[a[x][y]].clear();
	pentru (i,0,4)
		daca (cheie[a[x+dx[i]][y+dy[i]]]==0)
			daca (marc[x+dx[i]][y+dy[i]]==0)
			{
				marc[x+dx[i]][y+dy[i]]=1;
				K[a[x+dx[i]][y+dy[i]]].baga_la_sfarsit(fa_pereche(x+dx[i],y+dy[i]));
			}
			altfel ;
		altfel
			daca (marc[x+dx[i]][y+dy[i]]<=1)
			{
				marc[x+dx[i]][y+dy[i]]=2;
				Q.baga(fa_pereche(x+dx[i],y+dy[i]));
			}
}
void initializare()
{
	Q.baga(fa_pereche((k-1)/m+1,(k-1)%m+1));
    marc[(k-1)/m+1][(k-1)%m+1]=2;
}
void parcurgere_in_latime()
{
	numar_intreg x,y;
	cat_timp(nu_e Q.goala())
    {
        x=Q.fata().prim;
        y=Q.fata().secund;
        Q.sterge();
        ++s;
		fa (x,y);
    }
}
void afisare()
{
	g<<s<<"\n";
}
int main()
{
    citire();
	bordare();
	initializare();
	parcurgere_in_latime();
    afisare();
    return 0;
}