题目链接:https://codeforces.com/gym/101667/attachments
题意:现在让你从原点开始走,每次给你转向的方向你需要安排每一次转向要走多远并且让整个路径没有交点。
解题心得:螺旋走位法,记录上下左右能够到达的最远值,如果再次走该方向只需要比这个方向最远值多走一步就行了,这样不会有交点。
#include <bits/stdc++.h>
using namespace std
;
const int maxn
= 1e5+100;
struct Step
{
int len
, dir
;
}step
[maxn
];
int n
;
void init() {
scanf("%d", &n
);
for(int i
=1;i
<=n
;i
++) {
scanf("%d%d",&step
[i
].len
, &step
[i
].dir
);
}
}
int main() {
init();
int MaxX
, MinX
, MaxY
, MinY
, nowx
, nowy
;
MaxX
= MaxY
= MinX
= MinY
= nowx
= nowy
= 0;
int states
= 0;
vector
<int> ans
;
for(int i
=1;i
<=n
;i
++) {
int cnt
= 0;
if(states
== 0) {
cnt
= MaxX
- nowx
+ 1;
nowx
+= cnt
;
MaxX
= nowx
;
} else if(states
== 3) {
cnt
= nowy
- MinY
+ 1;
nowy
-= cnt
;
MinY
= nowy
;
} else if(states
== 2) {
cnt
= nowx
- MinX
+ 1;
nowx
-= cnt
;
MinX
= nowx
;
} else {
cnt
= MaxY
- nowy
+ 1;
nowy
+= cnt
;
MaxY
= nowy
;
}
ans
.push_back(cnt
);
states
= (states
+ step
[i
].dir
+ 4) % 4;
}
for(auto x
:ans
) {
printf("%d\n", x
);
}
return 0;
}