一道c++的有趣题目一个商人有一些重要性相同的必须要完成的任务,为了决定完成任务的顺序,他做了一下的操作.他把所有任务写成一个圆圈的形式,即第一个任务和最后一个相连.然后他随意
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/29 00:30:09
一道c++的有趣题目一个商人有一些重要性相同的必须要完成的任务,为了决定完成任务的顺序,他做了一下的操作.他把所有任务写成一个圆圈的形式,即第一个任务和最后一个相连.然后他随意
一道c++的有趣题目
一个商人有一些重要性相同的必须要完成的任务,为了决定完成任务的顺序,他做了一下的操作.
他把所有任务写成一个圆圈的形式,即第一个任务和最后一个相连.然后他随意挑选了一个数字r,顺时针(从任务1到2等等)从第一个任务数到第r个,把那个第r个任务移除表格,并从移除的下一个开始再数r个删除,反复如此操作直到剩下一个任务,输出这个任务.
读入:
必须读入从标准数据库读出数据.第一行有两个整数n 和r 彼此隔一个空格.n是任务数,大于2小于50,r是那个随机数字,大于1小于10000.
输出:输出一个任务.
例子 0
输入
4 2
a
b
c
d
输出 "a"
从 "a"开始数.所以 "a"=1,"b"=2.移除 "b",所以还剩 {a,c,d}.
从 "c"数.所以 "c"=1,"d"=2.移除 "d",所以剩 {a,c}.
从 "a"数.所以 "a"=1,"c"=2.移除"c",只剩下"a".
例子1输入
5 3
alpha
beta
gamma
delta
epsilon
输出:"delta"
例子 2 输入
26 17
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
输出:"n"
一道c++的有趣题目一个商人有一些重要性相同的必须要完成的任务,为了决定完成任务的顺序,他做了一下的操作.他把所有任务写成一个圆圈的形式,即第一个任务和最后一个相连.然后他随意
仔细看了这个问题,与约瑟夫问题有异曲同工之妙
下面是我的代码
int Task(PSeqList p,int n ,int r) //PSeqList p是一链表,你把读取的数据依次放入这里面
//n 是起始位置,题中的意思也就是从头开始,也就是0的意思,r和你题中的意思一样.
{
int s ,i ;
if( !p->length )
{
printf("表中无元素!\n")
return 0;
}
s=n-1;
printf("输出表中最后一个任务:\n")
for( i=p->length; i>=0 ; i++)
{
s=( s+ r -1) %i; //这里是每次循环跳到的位置,然后下面开始删除
Delete(p,s+1); //删去数到的这个任务
if(p->length==1)
printf("%c\t",p->data[0]); //输出最后一个任务
}
return 1;
}
有什么不懂的可以问我,以上算是这个问题的核心算法吧