Chinaunix首页 | 论坛 | 博客
  • 博客访问: 752167
  • 博文数量: 79
  • 博客积分: 2671
  • 博客等级: 少校
  • 技术积分: 1247
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-02 15:26
个人简介

宅男

文章分类

全部博文(79)

文章存档

2017年(11)

2016年(12)

2015年(6)

2012年(10)

2011年(33)

2010年(7)

分类: C/C++

2011-10-06 18:10:22

百度技术研发笔试题目

/*百度面试题

 * 有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。

 * 木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,

 * 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。

  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4. struct ant    {
  5.     int isout;
  6.     int postion;
  7.     int direct;
  8. };
  9. struct ant ant[5];
  10. #define STICK_LENGTH    27
  11. void init_ant_postion(void)
  12. {
  13.     ant[0].postion = 3;
  14.     ant[1].postion = 7;
  15.     ant[2].postion = 11;
  16.     ant[3].postion = 17;
  17.     ant[4].postion = 23;
  18.     int i = 0;
  19.     for(i = 0;i < 5;i++)
  20.         ant[i].isout = 0;
  21. }
  22. #define    DIRECTION_MASK 0x1
  23. void init_ant_driect(int a)
  24. {
  25.     int i = 0;
  26.     for(i = 0;i < 5;i++)
  27.     {
  28.         ant[i].direct = a&DIRECTION_MASK ? 1:-1;
  29.         a >>= 1;
  30.     }
  31. }
  32. void antisout(void)
  33. {    
  34.     int i;
  35.     for( i =0 ;i < 5;i++)
  36.         if(ant[i].postion < 0 || ant[i].postion > 27)
  37.             ant[i].isout =1;
  38. }

  39. int allout(void)
  40. {
  41.     int i ;
  42.     for(i = 0; i < 5;i++)
  43.         if(ant[i].isout == 0)
  44.             return 0;
  45.     return 1;
  46. }
  47. void swap(int *x, int* y)
  48. {
  49.     int tmp = *x;
  50.     *x = *y;
  51.     *y = tmp;
  52. }
  53. void ismeet(void)
  54. {    
  55.     int i ;
  56.     for( i = 0; i <=3;i++)
  57.     {
  58.         if(ant[i].isout == 0 && ant[i+1].isout == 0)
  59.             if(ant[i].postion == ant[i+1].postion)
  60.             {
  61.                 swap(&(ant[i].direct),&(ant[i+1].direct));
  62.             }
  63.     }
  64. }
  65. void walk(void)
  66. {
  67.     int i = 0;
  68.     for(i = 0; i < 5;i++)
  69.         ant[i].postion += ant[i].direct;
  70. }
  71. int ant_walk(void)
  72. {
  73.     int time = 0;//时间
  74.     while(++time)
  75.     {
  76.         walk();//每一只蚂蚁走一步
  77.         ismeet();//是否有两只蚂蚁相遇,如果相遇,那么掉头
  78.         antisout();//是否有蚂蚁走出木棍,如果是,那么就修改isout标志位
  79.         if(allout())//所有的蚂蚁是否离开木杆
  80.             break;
  81.     }
  82.     return time;
  83. }
  84. int main(void)
  85. {
  86.     int min = 27,max = 0;
  87.     for(int i = 0; i < 32;i++)//32 = 2^5
  88.     {
  89.         int time;
  90.         init_ant_postion();
  91.         init_ant_driect(i);
  92.         time = ant_walk();
  93. //        printf("%d\n",time);
  94.         if(time < min)
  95.             min =time;
  96.         if(time > max)
  97.             max = time;
  98.     }
  99.     printf("max = %d ,min = %d \n",max,min);
  100.     return 0;
  101. }

其实这道题目是一道智力题,因为所有的蚂蚁的速度是一样的,所以当两只蚂蚁相遇的时候
可以认为并没有掉头,而是相互擦肩而过,这样理解的话,就容易多了,所有的蚂蚁都是直线爬行的

阅读(1733) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~