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;
}