蚂蚁--模拟

来源:互联网 发布:智联招聘 java开发 编辑:程序博客网 时间:2024/05/17 06:22

一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的位置。


输入格式:

输入的第一行为数据组数。每组数据的第一行为3个正整数L、T、n(0<=n<=10000);以下n行每行描述一只蚂蚁的初始位置,其中,整数x为蚂蚁距离木棍左端的距离(单位:厘米),字母表示初始朝向(L表示朝左,R表示朝右)。

输出格式:

对于每组数据,输出n行,按输入顺序输出每只蚂蚁的位置和朝向(Turing表示正在碰撞)。在第T秒之前已经掉下木棍的蚂蚁(正好爬到木棍边缘的不算)输出Fell off。


样例输入:

2

10 1 4

1 R

5 R

3 L

10 R

10 2 3

4 R

5 L

8 R

样例输出:

Case #1:

2 Turing

6 R

2 Turing

Fell off


Case #2:

3 L

6 R

10 R


解:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include<cstdio>  
  2. #include<algorithm>  
  3. using namespace std;  
  4.   
  5. const int maxn = 10000+5;  
  6. const char dirName[][10] = {"L""Turing""R"};  
  7. int order[maxn];        //输入的第i只蚂蚁是终态中的左数第order[i]只蚂蚁  
  8. struct Ant  
  9. {  
  10.     int id;     //输入顺序  
  11.     int p;      //位置  
  12.     int d;      //朝向。-1:左;0:转身中;1:右  
  13.     bool operator < (const Ant &a) const  
  14.     {  
  15.         return p < a.p;  
  16.     }  
  17. }before[maxn], after[maxn];  
  18.   
  19. int main()  
  20. {  
  21.     int K;  
  22.     scanf("%d", &K);  
  23.     for(int ki = 1; ki <= K; ki++)  
  24.     {  
  25.         int L, T, n;  
  26.         scanf("%d%d%d", &L, &T, &n);  
  27.         for(int i = 0; i < n; i++)  
  28.         {  
  29.             int p, d;  
  30.             char c;  
  31.             scanf("%d %c", &p, &c);  
  32.             d = (c=='L') ? -1 : 1;  
  33.             before[i].id = i; before[i].p = p; before[i].d = d;  
  34.             after[i].id = 0; after[i].p = p+T*d; after[i].d = d;    //此处id还是未知的,用0代替  
  35.         }  
  36.           
  37.         //计算次序数组  
  38.         sort(before, before+n);  
  39.         for(i = 0; i < n; i++)  
  40.             order[before[i].id] = i;  
  41.   
  42.         //计算终态,保持原态或其它态  
  43.         sort(after, after+n);  
  44.         for(i = 0; i < n-1; i++)  
  45.             if(after[i].p == after[i+1].p) after[i].d = after[i+1].d = 0;  
  46.   
  47.         //输出结果  
  48.         printf("Case #%d:\n", ki);  
  49.         for(i = 0; i < n; i++)  
  50.         {  
  51.             int a = order[i];//恢复输入次序  
  52.             if(after[a].p < 0 || after[a].p > L) printf("Fell off\n");  
  53.             else printf("%d %s\n", after[a].p, dirName[after[a].d+1]);  
  54.         }  
  55.         printf("\n");  
  56.     }  
  57.     return 0;  
  58. }  


运行结果:


0 0
原创粉丝点击