标签:模拟
链接: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; }
标签:模拟
原文地址:http://blog.csdn.net/ooooooooe/article/details/37960837