CCF 201803-2 碰撞的小球 (C++)

这篇博客展示了如何使用C++解决一个关于球碰撞的问题。作者通过定义结构体Ball并进行排序,实现了对球的位置更新。在处理碰撞时,考虑了球与边界以及其它球的碰撞情况。代码在测试用例中表现良好,但实际提交时可能遇到bug,作者通过暴力穷举的方法解决了问题。博客强调了在编程中找到bug的挑战性和测试的重要性。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
满分代码

#include <iostream>
#include <algorithm>
using namespace std;
struct Ball
{
    int id=0;
    int a=0;
    int flag=1;
};
struct Ball ball[101];
bool cmp(Ball x,Ball y)//小到大排
{
    return x.a < y.a; //根据a从小到大排列
}
bool cmp2(Ball x,Ball y)//小到大排
{
    return x.id < y.id; //根据id从小到大排列
}
int main()
{
    int n,L,t;
    cin>>n>>L>>t;
    for(int i=0; i<n; i++)
    {
        cin>>ball[i].a;
         if(ball[i].a==L)ball[i].flag*=-1;
        ball[i].id=i;
    }
    sort(ball,ball+n,cmp);
    while(t>0)
    {
        for(int i=0; i<n; i++)
        {
            ball[i].a+=ball[i].flag;
            if(ball[i].a == L || ball[i].a == 0)
                ball[i].flag*=-1;
        }
        for(int i=1; i<n; i++)
            if(ball[i].a == ball[i - 1].a){
                ball[i].flag*= -1;
                 ball[i-1].flag*=-1;
            }


    //for(int i=0; i<n; i++)
       // cout<<ball[i].a<<" ";
         //    cout<<endl;

        t--;
    }
      sort(ball,ball+n,cmp2);

    for(int i=0; i<n; i++)
        cout<<ball[i].a<<" ";
    return 0;
}

小结:
学会使用结构体排序以后轻松了不少呀,不过编程最恶心的就是测试用例全对,交上去就报错,找bug是真的难顶,开始使用的代码,找半天不知道哪错了,最后借鉴了网上的一些成功案例,直接暴力穷举,我觉得这种测试就暴力算法好了,写对才是王道,性能第二

#include <iostream>
#include <algorithm>
using namespace std;
struct Ball
{
    int id=0;
    int a=0;
    int flag=0;
};
struct Ball ball[101];
bool cmp(Ball x,Ball y)//先按x从小到大排,相同,再按y从小到大
{
return x.a < y.a; //根据a从小到大排列
}
bool cmp2(Ball x,Ball y)//先按x从小到大排,相同,再按y从小到大
{
return x.id < y.id; //根据id从小到大排列
}
int main()
{
    int n,L,t;
    cin>>n>>L>>t;
    for(int i=0; i<n; i++)
    {
        cin>>ball[i].a;
        ball[i].id=i;
    }
       sort(ball,ball+n,cmp);
    while(t>0)
    {
        for(int i=0; i<n; i++)
        {

            if( ball[i].a>0&& ball[i].a<L) //未碰壁
            {
                if(ball[i].flag==0) //正向
                {
                    if(ball[i].a==ball[i+1].a){
                       ball[i]. flag=1;//碰撞反向
                        ball[i].a-=2;

                        ball[i+1].flag=0;


                    }
                    ball[i].a++;
                }
                else if(ball[i].flag==1) //反向
                {
                      if(ball[i].a==ball[i-1].a){
                       ball[i]. flag=0;//碰撞反向
                        ball[i].a+=2;

                        ball[i-1].flag=1;

                    }
                    ball[i].a--;
                }
            }
            else if(ball[i].a==L)
            {
              
                ball[i].flag=1;
                ball[i].a--;

            }
            else if(ball[i].a==0)
            {
                ball[i].flag=0;
                ball[i].a++;
            }

 cout<<ball[i].a<<" ";
        }


        cout<<endl;
        sort(ball,ball+n,cmp);
        t--;
    }
  sort(ball,ball+n,cmp2);
       for(int i=0; i<n; i++)
     cout<<ball[i].a<<" ";
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值