完美世界笔试题---小球弹性碰撞
2017-03-30 21:43
309 查看
题目描述:
时间限制:c/c++语言1000MS; 其它语言3000MS
内存限制:c/c++语言65536KB;其他语言589824KB
如下图一个类似手机屏幕的矩形区域,宽度为w,高度为h,一个小球(视为质点,忽略其体积大小)初始位于底边距离左侧x的位置,向右上角45度发射。当小球碰到边界时,按完全弹性碰撞理想反弹,如果小球恰好碰到角落,则反向返回。如此无限循环。
请编写程序,输出前n次小球回到底边时的横坐标(首次发射时的不算)。
输入:
每个输入是一行依次表示为w,h,x,n的4个正整数,且0<x<w
输出:
每个测试用例输出一行,包含n个整数,以空格隔开。
样例输入: 2 2 1 3
样例输出: 1 1 1
我想的数据:
输入:4 4 2 5
输出:2 2 2 2 2
输入:3 1 0 7
输出:2 2 0 2 2 0 2
输入:5 3 3 6
输出:1 5 1 3 3 1
思路:模拟整个过程,写四段程序,用en1、en2、en3、en4标记,分别表示小球到达上下左右边的四种情况,方便跳转,再用f取值{1,-1} 分别表示逆时针和顺时针。
代码如下:
时间限制:c/c++语言1000MS; 其它语言3000MS
内存限制:c/c++语言65536KB;其他语言589824KB
如下图一个类似手机屏幕的矩形区域,宽度为w,高度为h,一个小球(视为质点,忽略其体积大小)初始位于底边距离左侧x的位置,向右上角45度发射。当小球碰到边界时,按完全弹性碰撞理想反弹,如果小球恰好碰到角落,则反向返回。如此无限循环。
请编写程序,输出前n次小球回到底边时的横坐标(首次发射时的不算)。
输入:
每个输入是一行依次表示为w,h,x,n的4个正整数,且0<x<w
输出:
每个测试用例输出一行,包含n个整数,以空格隔开。
样例输入: 2 2 1 3
样例输出: 1 1 1
我想的数据:
输入:4 4 2 5
输出:2 2 2 2 2
输入:3 1 0 7
输出:2 2 0 2 2 0 2
输入:5 3 3 6
输出:1 5 1 3 3 1
思路:模拟整个过程,写四段程序,用en1、en2、en3、en4标记,分别表示小球到达上下左右边的四种情况,方便跳转,再用f取值{1,-1} 分别表示逆时针和顺时针。
代码如下:
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; void ball(int w,int h,int x,int n) { int px=x,py=0,f=1; goto endw; en1:; n--; cout<<px<<" "; if(!n) { cout<<endl; return ; } endw:; if(f==1)///从下侧逆时针跳 { if(h>w-px) { py=w-px; px=w; f=1; goto en2; } else if(h==w-px) { px=w; py=h; f=-1; goto en2; } else { px=px+h; py=h; f=-1; goto en4; } } else ///从下侧顺时针跳 { if(h>px) { py=px; px=0; f=-1; goto en3; } else if(h==px) { px=0; py=h; f=1; goto en3;} else { px=px-h; py=h; f=1; goto en4; } } en2:; if(f==1) { if(w>h-py) { px=w-h+py; py=h; f=1; goto en4; } else if(w==h-py) { px=0; py=h; f=-1; goto en4; } else { px=0; py=py+w; f=-1; goto en3; } } else { if(py<w) { px=w-py; py=0; f=-1; goto en1; } else if(py==w) { px=0; py=0; f=1; goto en1; } else { px=0; py=py-w; f=1; goto en3; } } en3:; if(f==1) { if(py<w) { px=py; py=0; f=1; goto en1; } else if(py==w) { px=w; py=0; f=-1; goto en1; } else { py=py-w; px=w; f=-1; goto en2; } } else { if(h-py<w) { px=h-py; py=h; f=-1; goto en4; } else if(h-py==w) { py=h; px=w; f=-1; goto en2; } else { px=w; py=py+w; f=1; goto en2; } } en4:; if(f==1) { if(px<h) { py=h-px; px=0; f=1; goto en3; } else if(px==h) { px=0; py=0; f=1; goto en1; } else { px=px-h; py=0; f=-1; goto en1; } } else { if(w-px<h) { py=h-(w-px); px=w; f=-1; goto en2; } else if(w-px==h) { px=w; py=0; f=-1; goto en1; } else { px=px+h; py=0; f=1; goto en1; } } } int main() { ///cout << "Hello world!" << endl; int w,h,x,n; while(cin>>w>>h>>x>>n) { ball(w,h,x,n); } return 0; }
相关文章推荐
- JS实现小球的弹性碰撞效果
- 三维小球弹性碰撞
- C++多小球非对心弹性碰撞(HGE引擎)
- 小球弹性碰撞
- java小球弹性碰撞
- poj -3684 小球弹性碰撞
- 第七讲:HTML5中的canvas两个小球全然弹性碰撞
- .NET GDI 模拟小球弹性碰撞(质点,动能守恒)
- 实现小球弹性碰撞
- C++多小球非对心弹性碰撞(HGE引擎)
- 【原创】小球碰撞动画
- (NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞
- poj2674 弹性碰撞 Linear world
- hdu 5066 小球碰撞(物理题)
- poj2674 弹性碰撞
- 碰撞检测(小球与舞台以及挡板碰撞的判断)
- js缓冲运动、弹性运动、碰撞运动
- js 小球碰壁反弹and小球碰撞
- 2016京东算法工程师实习生笔试编程题:小球的距离
- (NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞