CCF201803-2碰撞的小球C++实现满分

思路

小球的结构体:

typedef struct
{
	int x;
	bool v; 
}Ball;

x表示小球的位置,v表示小球的运动方向,true为向右,false为向左。
 
该问题的核心是弄清楚小球每移动一步之后的位置以及方向何时改变,由此我们把问题分为两个小问题:
1、小球的移动
2、小球方向的改变
为了记录小球的位置以便判断是否改变方向,我们定义一个数组dire[],初始化全为0,当有一个小球位于i位置时,dire[i]加一,当dire[i]=2时表示i位置有两个小球,这两个小球需要改变方向。
当小球位于两端时也需要改变方向。

代码

#include <iostream>
using namespace std;

typedef struct
{
	int x;
	bool v;//方向true为向右 
}Ball;

Ball ball[1005];
int dire[1005];//记录小球的为置 
int n,L,t;

void move(Ball &b)//小球运动函数 
{
	if(b.v==true)
	{
		dire[b.x]--;
		b.x++;
		dire[b.x]++;
	}	
	else
	{
		dire[b.x]--;
		b.x--;
		dire[b.x]++;	
	}
}

void changeDire()//小球方向改变函数 
{
	for(int i=0;i<=L;i++)
		if(dire[i]==2)
			for(int j=0;j<n;j++)
				if(ball[j].x==i)
					ball[j].v=!ball[j].v;
	
	for(int i=0;i<n;i++)
		if(ball[i].x==0 || ball[i].x==L)
			ball[i].v=!ball[i].v;
}

int main()
{
	cin>>n>>L>>t;
	for(int i=0;i<1000;i++)
		dire[i]=0;
	for(int i=0;i<n;i++)//初始化小球 
	{
		cin>>ball[i].x;
		ball[i].v=true;
		dire[ball[i].x]++;
		if(ball[i].x==L)//当小球的位置为最右边时,要改变其初始方向 
			ball[i].v=!ball[i].v;
	}
	for(int i=0;i<t;i++)
	{
		for(int j=0;j<n;j++)
			move(ball[j]);
		changeDire();
	}
	for(int i=0;i<n;i++)
		cout<<ball[i].x<<" ";
	cout<<endl;
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值