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