Gym-102483G Game Design水题解

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值