首先一直向前走,之后再考虑转向的事
转向时要尽量转180度,这里DFS不行,会超时
由于角度都是整数,所以开一个vis数组即可
注意应该先记录后标记,以防止出现明明是这一轮刚更新过的,结果以为是上一轮的,导致再次进行更新
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<map>
#include <iomanip>
using namespace std;
int jiaodu[55];
int cnt;
double zuijiejin;
int main(){
int cas;
cin>>cas;
while(cas--){
int num;
cin>>num;
double qian=0,hou=0;
string op;
double dis;
cnt=0;
zuijiejin=0;
while(num--){
cin>>op>>dis;
if(op[0]=='f'){
qian+=dis;
}
else if(op[0]=='b'){
hou+=dis;
}
else if(op[0]=='l'){
jiaodu[cnt++]=-1*dis;
}
else if(op[0]=='r'){
jiaodu[cnt++]=dis;
}
}
bool vis[360];
memset(vis,0,sizeof(vis));
vector<int>v;
for(int i=0;i<cnt;i++){
for(int j=0;j<360;j++){
if(vis[j]==1){//这里不能vis直接上,因为有可能个别vis是这一轮新添加的,这个新添加的有了能
//会被误以为是上一轮的,从而进行重复累加
v.push_back((j+jiaodu[i]+360)%360);
}
}
vis[(jiaodu[i]+360)%360]=1;
for(int j=0;j<v.size();j++)
vis[v[j]]=1;
v.clear();
}
zuijiejin=0;
for(int i=0;i<180;i++){
if(vis[180+i]==1||vis[180-i]==1){
zuijiejin=double(180-i);
break;
}
}
// double ans=disss(qian,hou,zuijiejin);
double zui=zuijiejin*(acos(-1.0)/180);
double ans=sqrt((sin(zui)*hou*sin(zui)*hou)+(qian-hou*cos(zui))*(qian-hou*cos(zui)));
// cout<<fixed<<setprecision(3)<<ans<<endl;
printf("%.3f\n",ans);
}
}
// 3
// 3
// f 100
// b 100
// l 90
// 4
// l 45
// f 100
// r 45
// f 100
// 6
// l 10
// f 40
// r 30
// l 10
// b 4
// f 4