poj 1234 Ball Toss
来源:互联网 发布:移动硬盘怎么恢复数据 编辑:程序博客网 时间:2024/05/16 08:47
//贡献了一次WA,原因是忽略了下面这句话:“Note that classmate number 1 initially has the ball and tosses it to classmate k. //Thus, number 1 has not yet been tossed the ball and so does not switch the direction he is thinking. ” 意思是说,虽然球是在同学1的//手中,但是他是否被传过球,记为false的!要注意啊!还有一个需要注意的就是“she throws it back across the circle one place to the left //(from her perspective) of the person who threw her the ball” 要注意括号里面的句子,好重要,即是说:这个方向是你看一个人的左与右的方向,//而不是一个人自己本身的左与右的方向!#include <iostream>#include <string>using namespace std;struct Info//储存同学的信息的 { int num;//同学的序号 char direction;//想象中的方向 bool flag;//是否有接过球,即是话有没有同学传过球给他 int leftnum;//在其他同学眼中,他左边的数字! int rightnum;//在其他同学眼中,他右边的数字! int left;//就他自己本身来说,他左边的数字! int right;//就他自己本身;来说,他右边的数字! }info[35];int main(){ int n, k, i, pre, c, tmp; char temp; bool ff; while (cin >> n && n) { cin >> k; for (i = 1; i <= n; i++)//信息的输入 { cin >> temp; info[i].num = i; info[i].direction = temp; info[i].flag = false; } //对他左右边数的赋值 info[1].rightnum = 2; info[1].left = 2; info[1].leftnum = n; info[1].right = n; info[n].rightnum = 1; info[n].left = 1; info[n].leftnum = n-1; info[n].right = n-1; for (i = 2; i < n; i++) { info[i].rightnum = i+1; info[i].left = i+1; info[i].leftnum = i-1; info[i].right = i-1; } pre = 1; c = 1; ff = false; while (1) { for (i = 1; i <= n; i++) { if (!info[i].flag) { ff = true; break; } } //分情况讨论其中的四种情况! if (ff) { if (info[k].direction == 'L') { info[k].flag = true; if (pre == info[k].left) { info[k].direction = 'R'; tmp = info[k].right; } else { info[k].direction = 'R'; tmp = info[pre].leftnum; } } else if (info[k].direction == 'R') { info[k].flag = true; if (pre == info[k].right) { info[k].direction = 'L'; tmp = info[k].left; } else { info[k].direction = 'L'; tmp = info[pre].rightnum; } } pre = k; k = tmp; ff = false; c++; } else break; } cout << "Classmate " << pre << " got the ball last after " << c-1 << " tosses." << endl;; } system("pause");}