zoukankan      html  css  js  c++  java
  • 完美世界笔试题---小球弹性碰撞

    题目描述:

       时间限制: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;
    }
  • 相关阅读:
    银行数据仓库体系实践(6)--调度系统
    银行数据仓库体系实践(5)--数据转换
    银行数据仓库体系实践(4)--数据抽取和加载
    银行数据仓库体系实践(3)--数据架构
    银行数据仓库体系实践(2)--系统架构
    银行数据仓库体系实践(1)--银行数据仓库简介
    敏捷开发和传统开发区别
    source ~/.bash_profile是什么意思
    oracle里的DBLINK是做什么的
    flex-direction的值及使用效果
  • 原文地址:https://www.cnblogs.com/chen9510/p/6648720.html
Copyright © 2011-2022 走看看