1.题目
题目链接:7-1 绿地围栏 - 2021 RoboCom 世界机器人开发者大赛-本科组(决赛) (pintia.cn)
2.具体实现
注意点:
1. 在紧邻的两点之间可能会存在几个打桩点,故如果在这一段里面发现了一个打桩点之后,不能直接跳过,还得以该打桩点为前驱点模拟。
2. 输出的时候,第一个需要输出(0,0),所以最后一个输出一定不能是(0,0),故输出的时候需要判断如果值的个数不为1的时候,最后一个目标值是不是(0,0)。
//模拟
//注意:如果最后是0,0刚刚好的时候不用打桩
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int> > p; //围栏坐标
vector<pair<int,int> > res; //存储结果
int main(void){
int n,l;
cin>>n>>l;
int x0=0,y0=0;
for(int i=1;i<=n;i++){
int t;
cin>>t;
if(i%2==0){
x0=t;
}else
y0=t;
p.push_back({x0,y0});
}
p.push_back({0,0});
int prex=0,prey=0; //前一个坐标
int cnt=0; //表示当前长度
res.push_back({0,0});
int x=0; //次序
while(x<p.size()){
int dx=p[x].first-prex; //dx<0,值变小
int dy=p[x].second-prey; //dy<0,值变小
int dis=max(abs(dx),abs(dy));
if(cnt+dis<l){
cnt+=dis;
prex=p[x].first;
prey=p[x].second;
x++;
}else if(cnt+dis==l){
//钉在顶点处
res.push_back({p[x].first,p[x].second});
prex=p[x].first;
prey=p[x].second;
x++;
cnt=0;
}else{ //钉在边上
int t=l-cnt; //还需要的长度
if(dy>0) prey+=t;
if(dy<0) prey-=t;
if(dx>0) prex+=t;
if(dx<0) prex-=t;
res.push_back({prex,prey});
cnt=0;
}
}
if(res.size()==1){
cout<<res[0].first<<" "<<res[0].second;
return 0;
}
for(int i=0;i<res.size()-1;i++){
if(i!=0) cout<<endl;
cout<<res[i].first<<" "<<res[i].second;
}
if(res[res.size()-1].first!=0||res[res.size()-1].second!=0)
cout<<endl<<res[res.size()-1].first<<" "<<res[res.size()-1].second;
return 0;
}
自己写的代码,欢迎指正!!!
都看到这里了,点个赞再走吧!(*^_^*)