比赛 noip20081103 评测结果 AAAAAAAAAA
题目名称 花园栅栏 最终得分 100
用户昵称 BYVoid 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2008-11-03 21:40:49
显示代码纯文本
#include <iostream>

using namespace std;

const int MAX=500;

struct point
{
	int x,y;
};

template <typename T> class tQueue
{
	private:
	class tqlist
	{
	public:
		tqlist *next;
		T value;
		tqlist(T tv):value(tv)
		{
			next=0;
		}
	};
	tqlist *first,*last;
	public:
	int size;
	void ins(T value)
	{
		if (first)
			last=last->next=new tqlist(value);
		else
			first=last=new tqlist(value);
		size++;
	}
	T pop()
	{
		size--;
		T rtn=first->value;
		tqlist *tp=first;
		first=first->next;
		delete tp;
		return rtn;
	}
	tQueue()
	{
		first=last=0;
		size=0;
	}
};

point cur;
int Map[MAX][MAX];
tQueue<point> Q;
int dx[]={0,0,2,-2},dy[]={2,-2,0,0};
int ddx[]={0,0,1,-1},ddy[]={1,-1,0,0};
int Alls,S,Ans;

void go(char c,int P)
{
	int i;
	P*=2;
	if (c=='N')
	{
		for (i=1;i<=P;i++,cur.y++)
		{
			Map[cur.x][cur.y]=-1;
		}
	}
	else if (c=='S')
	{
		for (i=1;i<=P;i++,cur.y--)
		{
			Map[cur.x][cur.y]=-1;
		}
	}
	else if (c=='E')
	{
		for (i=1;i<=P;i++,cur.x++)
		{
			Map[cur.x][cur.y]=-1;
		}
	}
	else if (c=='W')
	{
		for (i=1;i<=P;i++,cur.x--)
		{
			Map[cur.x][cur.y]=-1;
		}
	}
}

void init()
{
	int i,N,p;
	char c;
	freopen("fence.in","r",stdin);
	freopen("fence.out","w",stdout);
	scanf("%d%d%d\n",&cur.x,&cur.y,&N);
	cur.x*=2;
	cur.y*=2;
	cur.x+=10;
	cur.y+=10;
	Map[cur.x][cur.y]=-1;
	for (i=1;i<=N;i++)
	{
		scanf("%c%d\n",&c,&p);
		go(c,p);
	}
	Alls=110*110;
}

inline bool inrange(point p)
{
	return p.x>=1 && p.x<=220 && p.y>=1 && p.y <=220;
}

void debug()
{
	int i,j;
	for (i=1;i<=220;i+=2)
	{
		for (j=1;j<=220;j+=2)
		{
			cout << Map[i][j];
		}
		cout << endl;
	}
}

void floodfill(point i)
{
	point j,p;
	int k;
	Q.ins(i);
	Map[i.x][i.y]=1;
	while (Q.size)
	{
		i=Q.pop();
		S++;
		for (k=0;k<4;k++)
		{
			j.x=i.x+dx[k];
			j.y=i.y+dy[k];
			p.x=i.x+ddx[k];
			p.y=i.y+ddy[k];
			if (inrange(j))
			{
				if (Map[p.x][p.y]!=-1)
				{
					if (Map[j.x][j.y]==0)
					{
						Q.ins(j);
						Map[j.x][j.y]=1;
					}
				}
			}
		}
	}
}

void solve()
{
	point i;
	for (i.x=1;i.x<=220;i.x+=2)
	{
		i.y=1;
		if (Map[i.x][i.y]==0)
			floodfill(i);
		i.y=219;
		if (Map[i.x][i.y]==0)
			floodfill(i);
	}
	for (i.y=1;i.y<=220;i.y+=2)
	{
		i.x=1;
		if (Map[i.x][i.y]==0)
			floodfill(i);
		i.x=219;
		if (Map[i.x][i.y]==0)
			floodfill(i);
	}
	//debug();
	Ans=Alls-S;
}

int main()
{
	init();
	solve();
	cout << Ans << endl;
	return 0;
}