题目意思很简单,还记得轻工校赛好像也碰到了类似的题,但是当时没有任何思路,后来看了一眼题解,说要分为纵坐标和横坐标,然后我就写了好多次改了好多次,然后wa了n次,今晚又写了一遍,然后除了马虎,过了!看了题中的讨论,是精度的问题,于是又把原来的代码拉出来,精度一改,过了。。。。
贴两个代码,一个是以前写的需要改精度的,一个是现在写的没有改精度,感觉隔这么多天重新写的感觉就是思路更清晰了
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<map>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
#define repf(i,n,m) for(int i=(n); i<=(m); ++i)
#define repd(i,n,m) for(int i=(n); i>=(m); --i)
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define fab(a) ((a)>0?(a):(0-(a)))
#define ll long long
#define arc(a) ((a)*(a))
#define inf 100000
#define exp 0.000001
#define N
#define pi 3.1415926535
double l,w,x,y,r,a,v,t;
int main()
{
while(cin>>l>>w>>x>>y>>r>>a>>v>>t)
{
if(fabs(l-0)<exp && fabs(w-0)<exp)
break;
l-=r; w-=r;
a *= acos(0.0)/90.0;
double vx,vy;
vx=cos(a)*v;
vy=sin(a)*v;
double ti=t;
if(fabs(vx-0)>exp)
{
double len=(l-r)*2/fabs(vx);
while(t>=len)
t-=len;
len=vx*t;
x+=len;
while(x<r || x>l)
{
if(x<r)
x=r+(r-x);
if(x>l)
x=l-(x-l);
}
}
if(fabs(vy-0)>exp)
{
t=ti;
double len=(w-r)*2/fabs(vy);
while(t>=len)
t-=len;
len=vy*t;
y+=len;
while(y<r || y>w)
{
if(y<r)
y=r+(r-y);
if(y>w)
y=w-(y-w);
}
}
printf("%0.2lf %0.2lf\n",x,y);
}
return 0;
}
今晚写的:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<map>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
#define repf(i,n,m) for(int i=(n); i<=(m); ++i)
#define repd(i,n,m) for(int i=(n); i>=(m); --i)
#define ll long long
#define arc(a) ((a)*(a))
#define inf 100000
#define exp 0.000001
#define N
#define pi 3.141592653589
double l,w,x,y,r,a,v;
double t;
int main()
{
while(cin>>l>>w>>x>>y>>r>>a>>v>>t)
{
if(fabs(l-0)<exp && fabs(w-0)<exp)
break;
l-=r;
w-=r;
a=a/180*pi;
double tx,ty,vx,vy;
vx=v*cos(a);
vy=v*sin(a);
if(fabs(vx)>exp)
tx=2*(l-r)/fabs(vx);
else
tx=0;
if(fabs(vy)>exp)
ty=2*(w-r)/fabs(vy);
else
ty=0;
double te=t;
if(te>tx && tx>exp)
te-=ceil(te/tx)*tx;
if(tx>exp)
tx=te;
te=t;
if(te>ty && ty>exp)
te-=ceil(te/ty)*ty;
if(ty>exp)
ty=te;
x=x+vx*tx;
y=y+vy*ty;
while(x<r || x>l)
{
if(x<r) x=r-x+r;
if(x>l) x=l-(x-l);
}
while(y<r || y>w)
{
if(y<r) y=r-y+r;
if(y>w) y=w-(y-w);
}
printf("%0.2lf %0.2lf\n",x,y);
}
return 0;
}