Gym-102483G Game Design
题目连接:https://codeforces.com/gym/102483/problem/G
今天下午训练赛遇到这道题,玄学瞎搞一下就过了…
这个题的主要麻烦的是每一个方向上跑的距离是没办法确定的,但是只要保证最后的方向上没有阻拦而且指向(0,0)就可以有解,所以可以比较“随意”地跑,而且只要跑的比较玄学(离散) (毕竟图很大,s串只有20位),基本上就不会在最后的方向上有阻拦。
直接给一个起点(比如(100,100) ),然后按照输入的字符串开始跑,每次跑的距离能保证图比较离散就好,然后呢得到一个最后的点(tx,ty),这个点基本上是不会指向(0,0)的,但我们可以将所有的点都平移一下,使得最后那个点在s[len]这个方向上指向(0,0)。用set去一下重,然后判断一下是否在(tx,ty)到(0,0)之间有阻拦就可以了。
代码思维也比较简单。
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define IO std::ios::sync_with_stdio(false);cin.tie(0)
#define endl '\n'
#define lb(x) x&(-x)
#define pii pair<int,int>
#define pll pair<ll,ll>
using namespace std;
const double pi = 3.141592653589793238462;
const int maxn = 1e3+5;
const double eps = 1e-18;
const ull base = 13331;
const ll mod = 1e9+7;
vector<pii> node;
map<pll,int> mp;
string s;
int dis = 0;
int len;
int ck = 0;
void check(int x,int y){
int dx,dy;
if(s[len-1] == 'L'){
dx = -1;
dy = 0;
}
else if(s[len-1] == 'R'){
dx = 1;
dy = 0;
}
else if(s[len-1] == 'U'){
dy = 1;
dx = 0;
}
else{
dy = -1;
dx = 0;
}
for(int i = 0;i<20;i++){
x = x+dx;
y = y+dy;
if(mp.count({x,y})){
ck = 1;
return ;
}
}
}
int main(){
IO;
cin>>s;
len = s.size();
int x = 100,y = 100;
char dr = s[len-1];
int step = 1;
for(int i = 0;i<len;i++){
if(s[i] == 'L'){
x-=step;
}
else if(s[i] == 'R'){
x+=step;
}
else if(s[i] == 'U'){
y+=step;
}
else y-=step;
if(i == len-1){
break;
}
if(s[i] == 'L'){
node.push_back(make_pair(x-1,y));
mp[{x-1,y}] = 1;
}
else if(s[i] == 'R'){
node.push_back(make_pair(x+1,y));
mp[{x+1,y}] = 1;
}
else if(s[i] == 'U'){
node.push_back(make_pair(x,y+1)) ;
mp[{x,y+1}] = 1;
}
else {
node.push_back(make_pair(x,y-1));
mp[{x,y-1}] = 1;
}
if(i==0)continue;
if(s[i]=='L'&&s[i-1]=='R')continue;
if(s[i]=='R'&&s[i-1]=='L') continue;
if(s[i]=='D'&&s[i-1]=='U')continue;
if(s[i]=='U'&&s[i-1]=='D')continue;
step+=(i)+17;//玄学跑距离,试了俩数就过了
}
int tx,ty;
if(dr == 'L'){
tx = 100;
ty = 0;
}
else if(dr == 'R'){
tx = -100;
ty = -0;
}
else if(dr == 'U'){
tx = 0;
ty = -100;
}
else {
tx = 0;
ty = 100;
}
int dx = tx-x;
int dy = ty-y;
check(x,y);
if(ck){
cout<<"impossible";
return 0;
}
int nx = 100+dx,ny = 100+dy;
cout<<nx<<" "<<ny<<endl;
set<pii> st;
for(int i = 0;i<node.size();i++){
st.insert(node[i]);
}
cout<<st.size()<<endl;
for(auto e:st){
int tx = e.first+dx;
int ty = e.second+dy;
cout<<tx<<" "<<ty<<endl;
}
}