C语言之蚂蚁感冒
题目描述
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。 接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
输出
要求输出1个整数,表示最后感冒蚂蚁的数目。
输入
3
5 -2 8
输出
1
#include<stdio.h>
int main()
{
int n,i,flag=1,count=1;
scanf("%d",&n);
int arr1[50]={0},arr2[50]={0};
for(i=0;i<n;i++){
scanf("%d",&arr1[i]);
if(arr1[i]<0){
arr2[i]=-arr1[i];
}else{
arr2[i]=arr1[i];
}
}
if(arr1[0]>0){
for(i=1;i<n;i++){
if(arr1[i]<0&&arr2[i]>arr2[0]){
flag=1;
break;
}
}
if(flag==1){
for(i=i;i<n;i++){
if((arr1[i]<0&&arr2[i]>arr2[0])||(arr1[i]>0&&arr2[i]<arr2[0])){
count++;
}
}
}
}
else{
for(i=1;i<n;i++){
if(arr1[i]>0&&arr2[i]<arr2[0]){
flag=1;
break;
}
}
if(flag==1){
for(i=1;i<n;i++){
if((arr1[i]>0&&arr2[i]<arr2[0])||(arr1[i]<0&&arr2[i]>arr2[0])){
count++;
}
}
}
}
printf("%d",count);
return 0;
}
解析上述代码:首先flag=1,先前可能并不知道会使用,要根据后面判断是否需要使用。本来就有一个蚂蚁感冒,所以count的初始值应当为1,这样才能正确表示。
因为有方向的问题,又有位置即绝对值的问题,所以可以设两个数组,一个表示方向,一个表示位置(绝对值)(这道题目是必须要设两个变量来表示方向和位置的,又因为输入的有很多数值,用数组表示,所以表示方向和位置的变量也应当是数组)
要分成两部分,感冒的蚂蚁向左走和向右走。
当感冒蚂蚁向右走时,看是否有在该蚂蚁右边且向左走的蚂蚁,如果有,因为该蚂蚁和碰面的另一只蚂蚁都会往相反方向走,就要立马分为该蚂蚁左边和右边,(这时要出这个循环,那么就需要一个标志变量,证明存在上述情况)。和该感冒蚂蚁碰面的一定是右边第一个往左走的蚂蚁,所以只要右边还有往左走的蚂蚁,只要位置大于第一个感冒的蚂蚁就是大于被感冒的这只蚂蚁右边往左走的。所以可以写成(arr1[i] > 0 && arr2[i] < arr2[0])。左边往右走的,必定是位置小于第一个感冒的蚂蚁。
同理,一开始往左走的感冒蚂蚁一样这样写。
总结:对于标志变量的使用及什么时候使用应当搞清楚。

浙公网安备 33010602011771号