算法上那本紫书.. P82
10%9是1 19%10就像是9%10 是9
goto的思想..... ?其实不是很麻烦.. 写个函数好了
然后就是一定要注意边界... 还有比如p+d%n那个,一个是括号,另一个10 的时候试一下....
具体的写在注释里了.....边界搞清楚if possible
///练习键盘打字速度和减少错误率... 手机打字不算什么
/// 真的..... 以后也是啊 聊天请选电脑 我的天啊啊 竟然都可以一边摸鱼一边聊天
/// 聊2 个的同时还处理数据并A 了一道题.... 太厉害了
///....
#include<iostream>
#include<iomanip>
//这代码可是我看完书之后自己打的!!(((
// (((
// 真的效率好底我太懒了我要把手机扔了T T
using namespace std;
int n, m, k; int a[25];
int go(int p, int d, int t)
{
while (t--)
{
do
{// 10 +-1 +1= =9
p = (p + d +n-1) % n +1;//应用到 如果p=0,d=-1的时候%n就没了
// 然后就会卡住,但是你是%n所以加上一个无害的n就可以了
//不妨设p+d为0 两个式子的差距显然
///第一个式子结果是1~n之间 第二个式子是0~(n–1)(我的天啊!
//时时刻刻想着0!!!!!
// 不不不不.....主要是特殊情况,比如p+d=10,如果%n就是0,但是如果是p+d+n-1%n就是n-1,再+1=10
//所以为啥不用i=0;i<n...作孽啊
} while (a[p] == 0);}//??? 如果是0 的话,继续往下跑,直到不是0为止
//do while 的进步之处在于do里面的至少可以循环一次,然后这个p是下一个要被抓走做夫妻肺片的人
//如果这个人的确又不是0,就可以满足条件了,跳出循环
// 如果这个人是0,就是你经过查找找到了夫妻肺片材料是0,不符合条件,继续do,按相同的条件继续进行查找
//那么这个判断条件... p = (p + d + n - 1) % n + 1;
/ 10-1+10-1= 8 8 +1=9
//并且 在这里有个什么呢,被抓走变成0 的人要退出了,不参与,这里用do while下标就很方便
//门号还没变,但是已经变成0 了,对你而言还是走一样的t步数来完成使命.
return p;
}
int main()
{
while (cin >> n >> k>> m&&(n!=0&&m!=0&&k!=0))
{
//初始化!
for (int i = 1; i <= n; i++)
a[i] = i;
int left = n;
int p1 = n;
int p2 = 1;
while (left){
p1=go(p1, 1, k);
p2=go(p2, -1, m);
cout<<setw(3) << p1;
left--;
if (p1 != p2)
{
cout <<setw(3)<< p2 ;//不能在这输出啊= =
left--;
}
a[p1] = a[p2] = 0;//这都能理解,人死了钱没花了要写好一个=0
if (left)cout << ",";
}cout << endl;
}
return 0;
}