题目:http://10.105.242.80/problem/p/102/
把所有能转出的角度都枚举出来,然后找最接近180度的。
另外计算浮点数一定要注意精读,把int型转为double型再计算!!!我找了一下午发现是因为这个没有AC!
#include<stdio.h>
#include<bits/stdc++.h>
#define Pi acos(-1.0)
using namespace std;
double dis(double a,double b,double Ang) {
return sqrt(a*a+b*b-2*a*b*cos(Ang/180*Pi));
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int N;
scanf("%d",&N);
int fw=0,bw=0;
int visde[360]={0};
visde[0]=1;
while(N--){
char buf[50];
scanf("%s",buf);
string order(buf);
int x;
scanf("%d",&x);
if(order=="forward"){
fw+=x;
}else if(order=="backward"){
bw+=x;
}else if(order=="left"){
vector<int> tv;
for(int i=0;i<360;i++){
if(visde[i]){
tv.push_back((i+360-x)%360);
}
}
for(int i=0;i<tv.size();i++){
visde[tv[i]]=1;
}
visde[360-x]=1;
}else if(order=="right"){
vector<int> tv;
for(int i=0;i<360;i++){
if(visde[i]){
tv.push_back((i+x)%360);
}
}
for(int i=0;i<tv.size();i++){
visde[tv[i]]=1;
}
visde[x]=1;
}
}
int deg=0;int min=180;
for(int i=0;i<360;i++){
if(visde[i] && abs(i-180)<min){
deg=i;min=abs(i-180);
}
}
printf("%.3lf\n",dis(fw,bw,deg));
}
return 0;
}