AtCoder Beginner Contest 398-d

原题链接

看到这道题,我们可以想到将烟静止不动,每次移动则将人和火堆一起相反方向移动,而火堆在移动之前要将所在位置放上一朵烟(因为烟静止不动,所以火堆要在移动时放下一朵烟,代表着产生了一朵新的烟。而人移动则代表着烟向人的方向飘去),如果人移动后的位置有一朵烟,则输出\(1\),否则输出\(0\)

考虑如何维护哪些位置上有烟。因为地图有无限大,所以不能用一个二维数组来维护哪些位置上有烟。观察到烟最多有\(500000\)朵,所以我们可以用哈希表(键为\(pair<int,int>\)类型,代表烟的坐标。值为\(bool\)类型,代表这个位置是否有烟)来维护哪些位置上有烟。

CODE

#include<iostream>
#include<map>
using namespace std;
int n,x,y,xl,yl;
map<pair<int,int>,bool> mp;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>x>>y;
	xl=0,yl=0;
	char c;
	for(int i=1;i<=n;i++) 
	{
		cin>>c;
		if(c=='N')
		{
			mp[make_pair(xl,yl)]=true;
			xl++,x++;
			if(mp[make_pair(x,y)]==true)
			{
				cout<<1;
			}
			else cout<<0;
		}
		if(c=='S')
		{
			mp[make_pair(xl,yl)]=true;
			xl--,x--;
			if(mp[make_pair(x,y)]==true)
			{
				cout<<1;
			}
			else cout<<0;
		}
		if(c=='E')
		{
			mp[make_pair(xl,yl)]=true;
			yl--,y--;
			if(mp[make_pair(x,y)]==true)
			{
				cout<<1;
			}
			else cout<<0;
		}
		if(c=='W')
		{
			mp[make_pair(xl,yl)]=true;
			yl++,y++;
			if(mp[make_pair(x,y)]==true)
			{
				cout<<1;
			}
			else cout<<0;
		}
	}
	return 0;
}
posted @ 2025-03-23 09:34  CMY2013  阅读(25)  评论(0)    收藏  举报