1 条题解
-
0
C++ :
#include<iostream> #include<cstdio> #include<cmath> using namespace std; const int maxn = 10000+10; typedef struct Ants { int site; // 蚂蚁距离木棍左端的距离 char direction; // 朝向 bool flag0; // 判断蚂蚁是否可以移动 bool flag1; // 标志变量判断是否仍在木棍上 bool flag2; // 标志变量判断是否正在相撞,true 表示不想撞,false 表示相撞 }Ants; Ants ant[maxn]; // 初始化判断蚂蚁是否可以移动的变量置true void initflag0(int n) { for(int i = 0; i < n; i++) { ant[i].flag0 = true; } } // 初始化判断蚂蚁位置是否有重复的标志变量,全赋值为true void initflag2(int n) { for(int i = 0; i < n; i++) { ant[i].flag2 = true; } } // 判断蚂蚁是否可以移动 void ablemove(int n) { initflag0(n); // 标志变量赋初值 for(int i = 0; i < n; i++) { for(int j = 0;ant[j].flag0 && j < n && j != i; j++) { // 如果两只蚂蚁面对面 // 那么他们两个不移动,只是改变方向 if(ant[i].direction == 'R' ) { if(ant[j].direction == 'L') { if(ant[j].site-ant[i].site == 1) { ant[i].flag0 = false; ant[j].flag0 = false; } } } else { if(ant[j].direction == 'R') { if(ant[i].site-ant[j].site == 1) { ant[i].flag0 = false; ant[j].flag0 = false; } } } } } } // 判断蚂蚁位置是否有重复的 void repeatPosition(int n) { initflag2(n); // 标志变量赋初值 for(int i = 0; i < n; i++) { for(int j = 0;ant[j].flag2 && j < n && j != i; j++) { // 如果两个蚂蚁在同一个位置则需要掉头 // 指两个蚂蚁面对面但是中间空着一个格情况 if(ant[i].site == ant[j].site) { ant[i].flag2 = false; ant[j].flag2 = false; } } } } // 判断蚂蚁是否在木棍上 void inWoodStick(int L,int i) { if(ant[i].site < 0 || ant[i].site > L) { ant[i].flag1 = false; } } // 位置重合的蚂蚁转向 void turing(int n) { for(int i = 0; i < n; i++) { if(ant[i].flag2 == false || ant[i].flag0 == false) { if(ant[i].flag2 == false && ant[i].flag0 == false) continue; // 双重否定,就不用改变了 if(ant[i].direction == 'R') ant[i].direction = 'L'; else ant[i].direction = 'R'; } } } int main() { //freopen("1.txt","r",stdin); //freopen("2.txt","w",stdout); int M; cin >> M; int kcase = 0; // 种类 int T; // 时间 int L; // 木棍长度 int n; // 蚂蚁数量 while(M--) { cin >> L >> T >> n; // 输入位置和朝向 for(int i = 0; i < n; i++) { cin >> ant[i].site >> ant[i].direction; ant[i].flag0 = true; // 默认蚂蚁可以移动 ant[i].flag1 = true; // 默认在木棍上,之后再判断 inWoodStick(L,i); // 判断蚂蚁是否在木棍上 } // 初始化标志变量flag2,判断是否有蚂蚁在同一位置 repeatPosition(n); // 模拟移动过程 for(int t = 0; t < T; t++) { ablemove(n); // 首先判断每只蚂蚁是否可以移动 // 每个蚂蚁移动距离1 for(int i = 0; i < n; i++) { if(ant[i].flag1 == false) continue; // 如果已经不再木棍上则不用计算了 if(ant[i].flag0 == false) continue; if(ant[i].direction == 'R') ant[i].site++; else ant[i].site--; inWoodStick(L,i); // 判断蚂蚁是否在木棍上 } // 判断是否有蚂蚁在同一位置 repeatPosition(n); turing(n); // 如果在同一位置的则转向 } if(kcase++) { cout << endl; } cout << "Case#" << kcase << ":" << endl; for(int i = 0; i < n; i++) { if(!ant[i].flag1) { cout << "Fell off" << endl; continue; } cout << ant[i].site << " "; if(!ant[i].flag2) { cout << "Turning" << endl; } else { cout << ant[i].direction << endl; } } } return 0; }
- 1
信息
- ID
- 2890
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者