首页 > 编程知识 正文

约瑟夫问题的求解过程,约瑟夫环设计的理论知识

时间:2023-05-05 01:45:21 阅读:117381 作者:3441

你对约瑟夫问题time limit :1000 msmemorylimit 336065536 k有疑问吗? 这里^_^主题显示n人想玩残酷的死亡游戏。 游戏规则如下。

n人编号,分别从1到n,围成一个圈,顺时针从1数到m,数到m的人被杀了,剩下的人继续游戏,活到最后的人是赢家。

请输出最后一个人的号码。 输入n和m的值。 输出胜利者的号码。 输入示例5 3输出示例4显示第一: 3被杀,第二: 1被杀,第三: 5被杀,第四: 2被杀

# include stdio.h # include stdlib.h//下使用的malloc函数搞笑姐姐在里面struct mon //结构体{ int num; mon *next; (; mon*creat(intn ) /循环链表的创建函数) { int i; mon *p、*tail、*head; //游泳指针、尾指针和头指针p=(mon* ) malloc (sizeof ) mon ); p-num=1; p-next=空值; //生成第一个节点head=p; tail=p; for(I=2; i=n; I () () ) ) ) ) ) ) ) ) ) )按顺序创建链表,完成剩下的n-2个节点的插入) p=(mon* ) malloc ) sizeof (mon ) ) ); p-num=i; tail-next=p; tail=p; p-next=空值; } tail-next=head; //最后一个节点的指针字段指向第一个节点返回头; (intsel ) mon*head,int m,int n )/n个人申报数m号环出的控制函数(intnum=0; //表示人的申报数的计数变量int count=0; //用于计数出场人数的计数变量mon *p、*q; //指向当前节点及其前体节点的指针q=head; while (问下一步!=head ) q=q-next; //前驱节点为尾节点while(countn-1 )//或while ) q-next!=q ) { p=q-next; num; if(num%m==0)//找到已删除的节点,完成删除,然后单击({ q-next=p-next; //删除了当前的p节点free(p ); 释放count对删除的个数进行计数(} else q=p; }返回q-num; //最后一个节点的数据字段获胜的人的编号(}int main ()//主函数) { int n,m; mon *head; scanf('%d%d ),n,m ); head=creat(n; printf(%d(n ),sel ) head,m,n ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。