约瑟夫环(顺序表)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
针后移
} p[head]=p[test];// 报数到则 [ ] [ ] 报数到则test所指的位置出列ห้องสมุดไป่ตู้,修改 所指的位置出列 修改head
指针指向的下一位置
test=p[head];//记住出列位置 [ ] } printf(″\n%5d″,test);// 最后一个出列位置 ( \ ) }
设计一个程序求约瑟夫环的出列顺序。 例:设计一个程序求约瑟夫环的出列顺序。约瑟夫 设计一个程序求约瑟夫环的出列顺序 (Joseph)问题:有17个人按顺时针方向围坐一周 )问题: 个人按顺时针方向围坐一周 编号为0~ ),从第0号的人开始从 报数, ),从第 号的人开始从1报数 (编号为 ~16),从第 号的人开始从 报数,凡报到 3的倍数的人离开圈子,一直数下去,直到最后只剩下 的倍数的人离开圈子, 的倍数的人离开圈子 一直数下去, 一个人为止,问此人原来的位置是多少号? 一个人为止,问此人原来的位置是多少号?
3
P[i] i 1 0 2 1 3 2 4 3 5 4 6 5 7 6 8 7 0 16
head:下标值。由于报到3的倍数的 人要退出,为了保持循环顺序表的形 式,要改变退出的人的前一个的值, 例如:要改变P[1]的值使之变为3。 head用来标识报数的前一个人的下标 值,当报到3的倍数的人退出时,改 变前一个人的单元值为报到3的倍数 的人的单元值,使之保持循环顺序表 的形式。如此下去,当只有一个人的 时候test=p[test]。
test:下标值。本次报数完之后,下一个 值为本单元中存放的值,即下一个 test = P[test]
#include <stdio.h>// main() (){ () int i, p[17],test, head;// 设置循环控制变量、数组及两个数组下标指针 设置循环控制变量、 for(i=0;i<16;i++) ( ) p[i]=i+1;//存放下一个单元的下标值(位置号) [] 存放下一个单元的下标值(位置号) p[16]=0; [ ] test=0; //起始位置 从哪开始报数 起始位置(从哪开始报数 起始位置 从哪开始报数) while(test!=p[test]) // 位置号和该位置的下一位置相同时退出 ]){ ( [ ]) for(i=1;i<3;i++){ //重新报数 ( ) 重新报数 head=test;//将 head 指向每次报数的人的 位置 test=p[test];//test 指向 head 的下一位置进行报数,即test指 的下一位置进行报数, [ ] 指
算法设计:可设置一个数组P[17]; 算法设计:可设置一个数组
17个人,用数组下标表示编号,即0~16; 个人,用数组下标表示编号, 个人 ~ ; 值表示某个人, 用P[ i ] 值表示某个人,P[ i ]单元存放下一个单元的下标值 单元存放下一个单元的下标值 位置号) (位置号) i + 1,即 P[ i ] = i + 1;到最后一个人的时候就循 , 到最后一个人的时候就循 环到第一个人,设置 设置P[16] =0。 环到第一个人 设置 。
} p[head]=p[test];// 报数到则 [ ] [ ] 报数到则test所指的位置出列ห้องสมุดไป่ตู้,修改 所指的位置出列 修改head
指针指向的下一位置
test=p[head];//记住出列位置 [ ] } printf(″\n%5d″,test);// 最后一个出列位置 ( \ ) }
设计一个程序求约瑟夫环的出列顺序。 例:设计一个程序求约瑟夫环的出列顺序。约瑟夫 设计一个程序求约瑟夫环的出列顺序 (Joseph)问题:有17个人按顺时针方向围坐一周 )问题: 个人按顺时针方向围坐一周 编号为0~ ),从第0号的人开始从 报数, ),从第 号的人开始从1报数 (编号为 ~16),从第 号的人开始从 报数,凡报到 3的倍数的人离开圈子,一直数下去,直到最后只剩下 的倍数的人离开圈子, 的倍数的人离开圈子 一直数下去, 一个人为止,问此人原来的位置是多少号? 一个人为止,问此人原来的位置是多少号?
3
P[i] i 1 0 2 1 3 2 4 3 5 4 6 5 7 6 8 7 0 16
head:下标值。由于报到3的倍数的 人要退出,为了保持循环顺序表的形 式,要改变退出的人的前一个的值, 例如:要改变P[1]的值使之变为3。 head用来标识报数的前一个人的下标 值,当报到3的倍数的人退出时,改 变前一个人的单元值为报到3的倍数 的人的单元值,使之保持循环顺序表 的形式。如此下去,当只有一个人的 时候test=p[test]。
test:下标值。本次报数完之后,下一个 值为本单元中存放的值,即下一个 test = P[test]
#include <stdio.h>// main() (){ () int i, p[17],test, head;// 设置循环控制变量、数组及两个数组下标指针 设置循环控制变量、 for(i=0;i<16;i++) ( ) p[i]=i+1;//存放下一个单元的下标值(位置号) [] 存放下一个单元的下标值(位置号) p[16]=0; [ ] test=0; //起始位置 从哪开始报数 起始位置(从哪开始报数 起始位置 从哪开始报数) while(test!=p[test]) // 位置号和该位置的下一位置相同时退出 ]){ ( [ ]) for(i=1;i<3;i++){ //重新报数 ( ) 重新报数 head=test;//将 head 指向每次报数的人的 位置 test=p[test];//test 指向 head 的下一位置进行报数,即test指 的下一位置进行报数, [ ] 指
算法设计:可设置一个数组P[17]; 算法设计:可设置一个数组
17个人,用数组下标表示编号,即0~16; 个人,用数组下标表示编号, 个人 ~ ; 值表示某个人, 用P[ i ] 值表示某个人,P[ i ]单元存放下一个单元的下标值 单元存放下一个单元的下标值 位置号) (位置号) i + 1,即 P[ i ] = i + 1;到最后一个人的时候就循 , 到最后一个人的时候就循 环到第一个人,设置 设置P[16] =0。 环到第一个人 设置 。