这是一道模拟题
题目:
蚂蚁感冒
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
【数据格式】
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
要求输出1个整数,表示最后感冒蚂蚁的数目。
例如,输入:
3
5 -2 8
程序应输出:
1
再例如,输入:
5
-10 8 -20 12 25
程序应输出:
3
数据不大,让n只蚂蚁一步一步走就行了。这里有个坑导致错了很长时间。蚂蚁每秒种走1cm,而我起初是一秒钟每只蚂蚁都走1cm以后判断在同一位置的为相遇,然后点头感染等等。没有考虑蚂蚁面对面只相距1cm时,按照走一步1cm的方法下一步他两将交换位置,而事实上他俩应该在这一步的中间碰撞然后各自回头(如图)。所以将步长改为0.5,原来的pos改为double就过了。
代码:
<span style="font-size:12px;">#include <iostream>
#include<stdio.h>
using namespace std;
class ant
{
public:
double pos;//蚂蚁位置
int dir;//蚂蚁方向
int sick;//蚂蚁是否生病
};
ant ants[60];
int n;
double go()//行走函数
{
for(int i=0;i<n;i++)
{
if(ants[i].pos>0&&ants[i].pos<100)
{
if(ants[i].dir>0)//步长为0.5,注意注意
ants[i].pos+=0.5;
else
ants[i].pos-=0.5;
}
if(ants[i].pos>=100)//超过右端的置0
{
ants[i].pos=0;
}
}
double sum=0;
//碰撞掉头,感冒传染
for(int i=0;i<n;i++)
{
if(ants[i].pos>0&&ants[i].pos<100)
{
for(int j=i+1;j<n;j++)
{
if(ants[i].pos==ants[j].pos&&ants[i].dir==-ants[j].dir)
{
ants[i].dir=-ants[i].dir;
ants[j].dir=-ants[j].dir;
if(ants[i].sick==1||ants[j].sick==1)
{
ants[i].sick=1;
ants[j].sick=1;
}
}
}
}
sum+=ants[i].pos;
}
return sum;
}
int main()
{
int tmp;
int cnt=0;//输出感冒的只数
double sum=1;//初始为大于零,每走一步判断杆上还有几只
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&tmp);
if(tmp>0)
{
ants[i].dir=1;
ants[i].pos=tmp;
}else
{
ants[i].dir=-1;
ants[i].pos=-tmp;
}
if(i==0)
ants[i].sick=1;
else
ants[i].sick=0;
}
while(sum>0)
{
sum=go();//模拟蚂蚁行走知道杆上无蚁
}
for(int i=0;i<n;i++)
{
cnt+=ants[i].sick;
}
cout<<cnt<<endl;
return 0;
}
</span>