| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1179 人关注过本帖
标题:大家有没有生死者游戏的具体算法分析啊
只看楼主 加入收藏
xy1yn
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-9-21
收藏
 问题点数:0 回复次数:5 
大家有没有生死者游戏的具体算法分析啊

joseph生死者游戏**————单循环链表的应用
任务:每n个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全部一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定n人围成一圈,由第一个人数起,数到第m(m<n)人,再将他扔进大海中,如此循环地进行,直到剩下一半的乘客为止。问哪些位置是幸存者的位置(设计一个程序来求出列顺序)。
要求:利用单向循环链表存储结构模拟此过程,按照扔入大海的顺序输出各个人的编号。
测试数据:
  m的初值为9,n=30时的输出序列是?m=6,n=30时的输出序列是什么?
  要求:
输入数据:建立输入处理输入数据,输入m,n的初值,建立单循环链表。
  输出形式:选择的过程中输出扔入大海的人员编号。建立一个输出函数,将所有生者的编号输出。

搜索更多相关主题的帖子: 算法分析 死者 游戏 
2006-09-21 21:15
leolhc
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-1-17
收藏
得分:0 
Procedure DiuRen(var la:linkedlist);
// n>m>0; [ 和 ]分别代表begin和end。la是头节点。
read(m,n);
//建立单循环链表
pre:=la
for i:=1 to n do
[
new(p); pre^.next:=p; p^.data:=i; pre:=p;
]
p^.next:=la^.next;
//初始化
pre:=la; p:=la^.next; throw:=0;
while throw<n/2 do //不管n是偶数还是奇数,丢的人都要不少于一半。
[
for i:=1 to m-1 do
[
pre:=p; p:=p^.next;
]
pre^.next:=p^.next;
s:=p; p:=p^.next;
if la^.next=s then la^.next:=pre;
writeln(s^.data); //输出被丢的人的编号;
dispose(s); throw:=throw+1;
]
//下面按顺序输出生还者
p:=la^.next;
do
writeln(p^.data);
p:=p^.next;
until (p^.next=la^.next);
ENDP;

类pascal算法,请指正。

[此贴子已经被作者于2006-9-21 22:40:36编辑过]

2006-09-21 22:30
xy1yn
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-9-21
收藏
得分:0 
谢谢了 还不是很详细 我这里有完整的代码 大家看看
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}listnode,*linklist;
linklist creat(int n){
linklist head,p,q,rear;
int i;
head=(linklist)malloc(sizeof(listnode));
head->data=1;
head->next=0;
q=head;
for(i=2;i<=n;i++){
p=(linklist)malloc(sizeof(listnode));
p->data=i;
p->next=0;
q->next=p;
q=p;
}
rear=q;
rear->next=head;
return(head);
}
void select_death(linklist head,int n,int m)
{
linklist p,q;
int count,num=n;
p=head;
while(num>n/2){
for (count=2;count<m;count++)
p=p->next;
q=p->next;
printf("%d\t",q->data);
p->next=q->next;
free(q);
p=p->next;
num--;
}
}
main(){
listnode *head=NULL;
int n,m;
printf("游戏总人数");
scanf("%d",&n);
head=creat(n);
printf("第几个被扔下");
scanf("%d",&m);
select_death(head,n,m);
}
2006-09-22 09:44
leolhc
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-1-17
收藏
得分:0 
1、建议加头节点,以便问题的统一处理。
2、你忽略了对首节点的处理,当首节点正好是第m个时,你的head就被free了。“建立一个输出函数,将所有生者的编号输出。”的要求就无法实现了。
2006-09-22 10:18
xy1yn
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-9-21
收藏
得分:0 

谢谢了

2006-09-22 12:24
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 

这个实际上就是约瑟夫环的一种应用。
算法和约瑟夫环的是一样的,但输出稍微有点不同


我的征途是星辰大海
2006-09-22 12:47
快速回复:大家有没有生死者游戏的具体算法分析啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020257 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved