用数组存放蚂蚁坐标,模拟蚂蚁行动,直至蚂蚁坐标全为0或100;
每秒移动一次:
先改变蚂蚁坐标:1.若相邻坐标和为-1则碰面,仅改变蚂蚁方向; 2.否则将蚂蚁坐标+1。
再改变蚂蚁移动后的方向:若相邻坐标和为0则碰面,改变蚂蚁方向。
(每碰面一次,若两者之一感冒,则都感冒)
C++ 代码
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int is[50]={0}; //是否感冒
bool cmp(int a,int b){
return abs(a)<abs(b);
}
void move(int* a,int len){
int sum=0,i;
for( i=0;i<len;i++){ //移动蚂蚁
if(a[i]!=0&&a[i]!=100){
if(a[i]+a[i+1]==-1){ //碰面
if(is[i+1]||is[i])is[i+1]=is[i]=1;
a[i+1]=-a[i+1];
a[i]=-a[i];
i++;
}
else a[i]++;
}
else sum++;
}
if(sum==len)return; //全为0或100时结束循环
for(int i=1;i<len;i++){ //移动后判断是否碰面
if(a[i]!=0&&a[i]!=100){
if(a[i-1]+a[i]==0){
if(is[i-1]||is[i])is[i-1]=is[i]=1;
a[i-1]=-a[i-1];
a[i]=-a[i];
}
}
}
move(a,len);
}
int main(){
int n,k,a[50],ans;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
k=a[0];
sort(a,a+n,cmp); //按距离排序
for(int i=0;i<n;i++){ //记录第一个感冒的蚂蚁
if(a[i]==k){
is[i]=1;
break;
}
}
move(a,n);
for(int i=0;i<n;i++){
if(is[i]==1)ans++;
}
cout<<ans;
return 0;
}