欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

蚂蚁--模拟

发布时间:2025/6/15 编程问答 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 蚂蚁--模拟 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一根长度为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?
  • #include<cstdio>  
  • #include<algorithm>  
  • using namespace std;  
  •   
  • const int maxn = 10000+5;  
  • const char dirName[][10] = {"L""Turing""R"};  
  • int order[maxn];        //输入的第i只蚂蚁是终态中的左数第order[i]只蚂蚁  
  • struct Ant  
  • {  
  •     int id;     //输入顺序  
  •     int p;      //位置  
  •     int d;      //朝向。-1:左;0:转身中;1:右  
  •     bool operator < (const Ant &a) const  
  •     {  
  •         return p < a.p;  
  •     }  
  • }before[maxn], after[maxn];  
  •   
  • int main()  
  • {  
  •     int K;  
  •     scanf("%d", &K);  
  •     for(int ki = 1; ki <= K; ki++)  
  •     {  
  •         int L, T, n;  
  •         scanf("%d%d%d", &L, &T, &n);  
  •         for(int i = 0; i < n; i++)  
  •         {  
  •             int p, d;  
  •             char c;  
  •             scanf("%d %c", &p, &c);  
  •             d = (c=='L') ? -1 : 1;  
  •             before[i].id = i; before[i].p = p; before[i].d = d;  
  •             after[i].id = 0; after[i].p = p+T*d; after[i].d = d;    //此处id还是未知的,用0代替  
  •         }  
  •           
  •         //计算次序数组  
  •         sort(before, before+n);  
  •         for(i = 0; i < n; i++)  
  •             order[before[i].id] = i;  
  •   
  •         //计算终态,保持原态或其它态  
  •         sort(after, after+n);  
  •         for(i = 0; i < n-1; i++)  
  •             if(after[i].p == after[i+1].p) after[i].d = after[i+1].d = 0;  
  •   
  •         //输出结果  
  •         printf("Case #%d:\n", ki);  
  •         for(i = 0; i < n; i++)  
  •         {  
  •             int a = order[i];//恢复输入次序  
  •             if(after[a].p < 0 || after[a].p > L) printf("Fell off\n");  
  •             else printf("%d %s\n", after[a].p, dirName[after[a].d+1]);  
  •         }  
  •         printf("\n");  
  •     }  
  •     return 0;  
  • }  

  • 运行结果:


    总结

    以上是生活随笔为你收集整理的蚂蚁--模拟的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。