链接:http://vjudge.net/problem/viewProblem.action?id=49407
题意:有若干只蚂蚁,给出它们在管子内的坐标和它们的移动方向,如果两只蚂蚁在坐标为整数的位置相遇,那么它们分别调头,否则,两只蚂蚁穿过对方,继续前进。现在问什么时候蚂蚁能全部离开这个管子,并且求出最后一只离开管子的蚂蚁的编号。
是一道纯模拟题,以前觉得这种模拟题的代码量太大,不愿意做,这次A掉以后,感觉神清气爽。
思路:直接模拟即可。
代码:
#include<iostream>
#include<set>
#include<map>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
struct aa
{
int num;
int l;
char dir[2];
} ant[25];
bool cmp(aa a,aa b)
{
return (a.l<b.l)||(a.l==b.l&&a.dir[0]>b.dir[0]);
};
int main()
{
int tot,len;
while(scanf("%d%d",&tot,&len)&&(tot!=0&&len!=0))
{
memset(ant,0,sizeof(ant));
for(int i=0; i<tot; i++)
{
scanf("%s%d",ant[i].dir,&ant[i].l);
ant[i].num=i;
}
int second=0,o=0;
int a=0;
while(1)
{
bool flag =0;
o=0;
for(int i=0; i<tot; i++)
{
if(ant[i].l==0||ant[i].l==len)
o++;
}
if(o==tot-1)
{
for(int i=0; i<tot; i++)
{
if(ant[i].l>0&&ant[i].l<len)
{
a=ant[i].num+1;
break;
}
}
}
else if(o==tot-2)
{
int a1=-1,a2=-1;
int l1=-1,l2=-1;
bool flag1=0;
for(int i=0; i<tot; i++)
{
if(ant[i].l>0&&ant[i].l<len&&!flag1)
{
a1=ant[i].l;
l1=ant[i].num;
flag1=1;
}
else if(ant[i].l>0&&ant[i].l<len)
{
a2=ant[i].l;
l2=ant[i].num;
}
}
if(a1+a2==len)
{
if(a1<a2)
a=l1+1;
else a=l2+1;
}
}
for(int i=0; i<tot; i++)
{
if(ant[i].l>0&&ant[i].l<len)
{
flag = 1;
if(ant[i].dir[0]=='R')
{
if(ant[i+1].dir[0]=='L')
{
if(ant[i+1].l==ant[i].l+1)
{
ant[i].l++;
ant[i+1].l--;
i++;
}
else if(ant[i+1].l==ant[i].l+2)
{
ant[i].l++;
ant[i+1].l--;
i++;
}
else
{
ant[i].l++;
}
}
else ant[i].l++;
}
else ant[i].l--;
}
}
if(flag)
second++;
else break;
sort(ant,ant+tot,cmp);
for(int i=0; i<tot; i++)
{
if(ant[i].l==ant[i+1].l&&ant[i].dir[0]=='R'&&ant[i].l!=0&&ant[i].l!=len)
{
ant[i].dir[0]='L';
ant[i+1].dir[0]='R';
}
}
}
printf("%d %d\n",second,a);
}
return 0;
}