Cod sursa(job #178202)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 14 aprilie 2008 11:04:38
Problema Zota & Chidil Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream.h>
#include<math.h>

int max(int a,int b)
	{
	if (a<b) return b;
		else return a;
	}

int min(int a, int b)
	{
	if (a<b) return a;
		else return b;
	}

struct punct {
	     int x,y;
	     };

int verificv (punct p1, punct p2, punct c)
	{
	if (abs(p1.x-c.x)<=2 && c.y-2<=p2.y && c.y+2>=p1.y)
		{
		int i,nr=0,t=1,a[7][7];memset(a,0,sizeof(a));
		a[1][3]=a[2][2]=a[2][3]=a[2][4]=a[3][1]=a[3][2]=a[3][3]=a[3][4]=a[3][5]=a[4][2]=a[4][3]=a[4][4]=a[5][3]=1;
		for (i=max(c.y-2,p1.y);i<=min(c.y+2,p2.y);i++,t++)
			if (a[5-t+1][abs(p1.x-c.x)+3]==1) nr++;
		return nr;
		}
	return 0;
	}

int verifico (punct p1, punct p2, punct c)
	{
	if (abs(p1.y-c.y)<=2 && c.x-2<=p2.x && c.x+2>=p1.x)
		{
		int i,nr=0,t=1,a[7][7];memset(a,0,sizeof(a));
		a[1][3]=a[2][2]=a[2][3]=a[2][4]=a[3][1]=a[3][2]=a[3][3]=a[3][4]=a[3][5]=a[4][2]=a[4][3]=a[4][4]=a[5][3]=1;
		for (i=max(c.x-2,p1.x);i<=min(c.x+2,p2.x);i++,t++)
			if (a[abs(p1.y-c.y)+3][6-t]==1) nr++;
		return nr;
		}
	return 0;
	}


int main()
{
long long t=0;
int n,k,m,i,j;
char ch;
punct v[100002],p1,p2; p1.x=0;p1.y=0;
ifstream f("zc.in");
f>>n>>m;
for (i=1;i<=n;i++) f>>v[i].x>>v[i].y;
for (i=1;i<=m;i++)
	{
	f>>ch>>k;
	if (ch=='N') {p2.x=p1.x;p2.y=p1.y+k;}
		else if (ch=='S') {p2.x=p1.x;p2.y=p1.y-k;}
			else if (ch=='E') {p2.y=p1.y;p2.x=p1.x+k;}
				else { p2.y=p1.y;p2.x=p1.x-k;}
	for (j=1;j<=n;j++)
		if (ch=='N' || ch=='S') if (ch=='N') t+=verificv(p1,p2,v[j]);
						else t+=verificv(p2,p1,v[j]);
				   else if (ch=='E') t+=verifico(p1,p2,v[j]);
						else t+=verifico(p2,p1,v[j]);
	p1=p2;
	}
f.close();
ofstream g("zc.out");
g<<t; g.close();
return 0;
}