标签:一个 在线 而且 位置 bre pos 速度 冲突 初始
#include <stdio.h> #include <string.h> #include <vector> #define MAX 105 #define MAX_LEN 1005 using namespace std; typedef struct Node{ int pos; //位置 int dir; //方向 左0右1 }Node; Node s[MAX]; vector<int> len[MAX_LEN]; // [坐标位置] :顶点 占据某个坐标位置的顶点集合 int main(){ int n,l,t; int pos; while(scanf("%d %d %d",&n,&l,&t)!=EOF){ for(int i=0;i<=l;i++) len[i].clear(); for(int i=1;i<=n;i++){ scanf("%d",&pos); s[i].pos=pos; if(pos==l) s[i].dir=0; //初始位置在右端点,则方向向左 else s[i].dir=1; //否则,初始方向为右 len[pos].push_back(i); } for(int i=1;i<=t;i++){ for(int j=1;j<=n;j++){ if(s[j].dir==1){ int p =s[j].pos; for(vector<int>::iterator iter=len[p].begin();iter!=len[p].end();iter++){ //从vector中删除顶点 if(*iter==j){ len[p].erase(iter); break; } } s[j].pos++; p++; len[p].push_back(j); //被顶点j占据 if(s[j].pos==l ) s[j].dir=0; //如果改变后位置在右端点,则方向变左 } else if(s[j].dir==0){ int p =s[j].pos; for(vector<int>::iterator iter=len[p].begin();iter!=len[p].end();iter++){ //删除顶点 if(*iter==j){ len[p].erase(iter); break; } } s[j].pos--; p--; len[p].push_back(j); if(s[j].pos==0 ) s[j].dir=1; //如果改变后位置在左端点,方向变右 } } for(int k=0;k<=l;k++){ if(len[k].size()==1) continue; //如果只有一个顶点占据该坐标,则不冲突 for(int i=0;i<len[k].size();i++){ int v=len[k][i]; s[v].dir=!s[v].dir; //如果相撞了,改变顶点的方向 } } } for(int i=1;i<=n;i++){ if(i!=n) printf("%d ",s[i].pos); else printf("%d\n",s[i].pos); } } return 0; }
标签:一个 在线 而且 位置 bre pos 速度 冲突 初始
原文地址:https://www.cnblogs.com/shiliuxinya/p/12219008.html