Cod sursa(job #265517)

Utilizator nautilusCohal Alexandru nautilus Data 23 februarie 2009 23:22:08
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream.h>



int main()
{
 long n,m,k,i,aux,sfc,inc,c,x,j;
 unsigned int q[24025];

 long lst[155][155];
 unsigned int u[24025];

 ifstream fin("castel.in");
 fin>>n>>m>>k;


 for (i=1; i<=n*m; i++)
	{
	 lst[i][0]=0;
	 u[i]=0;
	 fin>>aux;
	 lst[aux][0]++;
	 lst[aux][lst[aux][0]]=i;
	}

 q[1]=k; inc=0; sfc=1; u[k]=1; c=1;

 while (inc<=sfc)
	{
	 inc++;

	 for (i=1; i<=lst[q[inc]][0]; i++)
		{
		 x=lst[q[inc]][i];
		 if (u[x]==0)
			{
			 //nu e pe margine
			 if (x%m!=1 && x%m!=0)
				{
				 if (u[x-1]==1 || u[x+1]==1 || u[x-m]==1 || u[x+m]==1)
					{
					 u[x]=1;
					 sfc++;
					 q[sfc]=x;
					 c++;
					} else
					{
					 lst[x-1][0]++; lst[x-1][lst[x-1][0]]=x;
					 lst[x+1][0]++; lst[x+1][lst[x+1][0]]=x;
					 lst[x-m][0]++; lst[x-m][lst[x-m][0]]=x;
					 lst[x+m][0]++; lst[x+m][lst[x+m][0]]=x;
					}
				} else
			 //marginea stanga
			 if (x%m==1)
				{
				 if (u[x+1]==1 || u[x-m]==1 || u[x+m]==1)
					{
					 u[x]=1;
					 sfc++;
					 q[sfc]=x;
					 c++;
					} else
					{
					 lst[x-1][0]++; lst[x-1][lst[x-1][0]]=x;
					 lst[x+1][0]++; lst[x+1][lst[x+1][0]]=x;
					 lst[x-m][0]++; lst[x-m][lst[x-m][0]]=x;
					 lst[x+m][0]++; lst[x+m][lst[x+m][0]]=x;
					}
				} else
			 //marginea dreapta
			 if (x%m==0)
				{
				 if (u[x-1]==1 || u[x-m]==1 || u[x+m]==1)
					{
					 u[x]=1;
					 sfc++;
					 q[sfc]=x;
					 c++;
					} else
					{
					 lst[x-1][0]++; lst[x-1][lst[x-1][0]]=x;
					 lst[x+1][0]++; lst[x+1][lst[x+1][0]]=x;
					 lst[x-m][0]++; lst[x-m][lst[x-m][0]]=x;
					 lst[x+m][0]++; lst[x+m][lst[x+m][0]]=x;
					}
				}
			}
		}
	}

 ofstream fout("castel.out");
 fout<<c;

 fin.close();
 fout.close();

 return 0;
}