【算法设计与分析】蚂蚁
2016-06-30 17:03
429 查看
【题目】
【输入输出】
【样例】
【源代码】
<span style="font-family:Microsoft YaHei;font-size:24px;">#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=10005;
struct ants
{
int id ; //输入序号
int pos ; //在小木棍上的顺序
int status ; //状态
bool operator <( const ants an) const//排序
{
return pos<an.pos;
}
}begins[maxn],ends[maxn];
int order[maxn];
int main()
{
int test;
int T,L,n;
char str;
int a;
scanf("%d",&test);//测试组数
for(int k=1;k<=test;k++)
{
printf("Case #%d:\n",k);//输入第几组数据
scanf("%d%d%d",&L,&T,&n);//木棍长度,爬行时间,共几只蚂蚁
// printf("L=%d T=%d n=%d\n",L,T,n);
for(int j=0;j<n;j++)
{
scanf("%d %c",&a,&str);//输入第j只蚂蚁的状态
int value=(str=='L')?-1:1;//如果蚂蚁的状态为左,返回-1,否则返回为1
begins[j]=(ants){j,a,value};//第j只蚂蚁的初始状态
ends[j]=(ants){j,a+T*value,value};//第j只蚂蚁的最后状态。不考虑蚂蚁调转的情况
// printf("begin[%d]=%d end[%d]=%d\n",k,begin[k],k,end[k]);
}
sort(begins,begins+n);//对蚂蚁进行排序
for(int i=0;i<n;i++)//对蚂蚁的顺序进行排序,并且记录该蚂蚁的位置
order[begins[i].id]=i;
sort(ends,ends+n);//根据最后的状态进行排序
for(int i=0;i<n-1;i++)
if(ends[i].pos==ends[i+1].pos)//如果第i个蚂蚁的位置和第i+1个相同,那么两只蚂蚁的状态标记为0
ends[i].status=ends[i+1].status=0;
char chastr[][10]={"L","Turning","R"};//用一个数组存储状态值
for(int i=0;i<n;i++)
{
int a=order[i];
if(ends[a].pos<0||ends[a].pos>L)
printf("Fell off\n");
else
printf("%d %s\n",ends[a].pos,chastr[ends[a].status+1]);
}
printf("\n");
}
return 0;
}
</span>
【简述】
来一组数据测试就会发现,出发前和出发后,每一个蚂蚁的相对位置都是不变的,然后 看代码的注释,很详细
【输入输出】
【样例】
【源代码】
<span style="font-family:Microsoft YaHei;font-size:24px;">#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=10005;
struct ants
{
int id ; //输入序号
int pos ; //在小木棍上的顺序
int status ; //状态
bool operator <( const ants an) const//排序
{
return pos<an.pos;
}
}begins[maxn],ends[maxn];
int order[maxn];
int main()
{
int test;
int T,L,n;
char str;
int a;
scanf("%d",&test);//测试组数
for(int k=1;k<=test;k++)
{
printf("Case #%d:\n",k);//输入第几组数据
scanf("%d%d%d",&L,&T,&n);//木棍长度,爬行时间,共几只蚂蚁
// printf("L=%d T=%d n=%d\n",L,T,n);
for(int j=0;j<n;j++)
{
scanf("%d %c",&a,&str);//输入第j只蚂蚁的状态
int value=(str=='L')?-1:1;//如果蚂蚁的状态为左,返回-1,否则返回为1
begins[j]=(ants){j,a,value};//第j只蚂蚁的初始状态
ends[j]=(ants){j,a+T*value,value};//第j只蚂蚁的最后状态。不考虑蚂蚁调转的情况
// printf("begin[%d]=%d end[%d]=%d\n",k,begin[k],k,end[k]);
}
sort(begins,begins+n);//对蚂蚁进行排序
for(int i=0;i<n;i++)//对蚂蚁的顺序进行排序,并且记录该蚂蚁的位置
order[begins[i].id]=i;
sort(ends,ends+n);//根据最后的状态进行排序
for(int i=0;i<n-1;i++)
if(ends[i].pos==ends[i+1].pos)//如果第i个蚂蚁的位置和第i+1个相同,那么两只蚂蚁的状态标记为0
ends[i].status=ends[i+1].status=0;
char chastr[][10]={"L","Turning","R"};//用一个数组存储状态值
for(int i=0;i<n;i++)
{
int a=order[i];
if(ends[a].pos<0||ends[a].pos>L)
printf("Fell off\n");
else
printf("%d %s\n",ends[a].pos,chastr[ends[a].status+1]);
}
printf("\n");
}
return 0;
}
</span>
【简述】
来一组数据测试就会发现,出发前和出发后,每一个蚂蚁的相对位置都是不变的,然后 看代码的注释,很详细
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法