Problem Description
The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is going to be executed and only the life of the last remaining person will be saved. Joseph was smart enough to choose the position of the last remaining person, thus saving his life to give us the message about the incident. For example when n = 6 and m = 5 then the people will be executed in the order 5, 4, 6, 2, 3 and 1 will be saved.

Suppose that there are k good guys and k bad guys. In the circle the first k are good guys and the last k bad guys. You have to determine such minimal m that all the bad guys will be executed before the first good guy.

 
Input
The input file consists of separate lines containing k. The last line in the input file contains 0. You can suppose that 0 < k < 14.

 
Output
The output file will consist of separate lines containing m corresponding to k in the input file.

 
Sample Input
3
4
0
 
Sample Output
5
30
题意:给出一个k,代表有K个好人与K个坏人,其中前K个是好人,后K个是坏人,根据约瑟夫环游戏的原理,在坏人都出局而好人没有一个都没有出局的情况下,m最小是多大


#include<stdio.h>
#include<malloc.h>
#include<string.h>
int vist[30];
typedef struct list
{
int data;
struct list *next;
}Lnode,*LinList; void creat_L(LinList *L)
{
(*L)=(LinList)malloc(sizeof(Lnode));
(*L)->data=0;
(*L)->next=(*L);//形成环
}
int DeleteNode(LinList L,int k,int n)//n是走的步数,k是有多少个好人和坏人
{
int j,i=0,badk=0,mod;
LinList q=L; while(i<k)//i是代表有i个坏人被处决
{
q=q->next;
j=1;//j=1是从当前位置开始计数,看下面的代码
while(vist[q->data]||q->data==0)//跳过己经处决的,vist为0时,表示这人还活着
{
q=q->next;
}
mod=n%(2*k-i);//(2*k-i)代表活着的人数,mod就等于走了很多圈以后余下的步数少于活着的人数
if(mod==0)//代表从当前位置走了n步后又最后会回到当前位置,那么就等于活着的人数
mod=2*k-i;
while (j<mod)//开始走
{
q=q->next;
if(vist[q->data]==0&&q->data!=0)//为了跳过处决了的,活着才能+1,算是一步
j++;
}
if(q->data<=k)//代表处决的是好人,不满足只处决坏人,不用往下走了,跳出循环
break;
if(q->data>k)//大于k的说明处决的是坏人,那么计数加一个
badk++;
vist[q->data]=1;//代表处决了
i++; //下一次 //printf("%d ",q->data);
}
return badk;//反回处决坏人的人数
} void Crea_list(LinList L,int n)//创建一个以n个人的圈
{
int i;
LinList q=L,p;
for(i=n;i>=1;i--)
{
p=(LinList)malloc(sizeof(Lnode));
p->data=i;
p->next=q->next;
q->next=p;
}
} int main()
{
int i,k,m,j,t,a[16];
LinList L,q;
for(j=1;j<14;j++)//打表
{
creat_L(&L);
Crea_list(L,2*j);
q=L;
if(j<=9)
for(m=j+1;;m++)//表法要直的步数
{
memset(vist,0,sizeof(vist));
t=DeleteNode(L,j,m); if(t==j)//表法以当前的步数走,处决的坏个等于坏人总数,就跳出来
break;
}
else
{
m=90000;
for(;;m++)
{
memset(vist,0,sizeof(vist));
t=DeleteNode(L,j,m); if(t==j)
break;
}
}
a[j]=m;
}
while(scanf("%d",&k)>0&&k)
{
printf("%d\n",a[k]);
}
}
/*
1
2
2
7
3
5
4
30
5
169
6
441
7
1872
8
7632
9
1740
10
93313
11
459901
*/

 

hdu1443(约瑟夫环游戏的原理 用链表过的)的更多相关文章

  1. 简单约瑟夫环的循环单链表实现(C++)

    刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...

  2. 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用

    什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...

  3. 约瑟夫环问题 --链表 C语言

    总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...

  4. 约瑟夫环(Joseph)的高级版(面向事件及“伪链表””)

    约瑟夫环问题: 在一间房间总共有n个人(下标0-n-1),只能有最后一个人活命. 按照如下规则去杀人: 所有人围成一圈 顺时针报数,每次报到q的人将被杀掉 被杀掉的人将从房间内被移走 然后从被杀掉的下 ...

  5. 约瑟夫环问题的链表解法和数学解法(PHP)

    约瑟夫环问题 一群猴子排成一圈.按1,2,-,n依次编号.然后从第1仅仅開始数,数到第m仅仅,把它踢出圈.从它后面再開始数,再数到第m仅仅.在把它踢出去-.如此不停的进行下去.直到最后仅仅剩下一仅仅猴 ...

  6. Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

    1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...

  7. 单向环形链表解决约瑟夫环(Josephus)问题

    一.约瑟夫环问题 Josephu 问题为:设编号为1,2,- n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那 ...

  8. C语言链表实现约瑟夫环问题

    需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...

  9. C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

    尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...

随机推荐

  1. No2_1.接口继承多态_Java学习笔记_接口

    接口.继承与多态 1.继承和多态是面向对象开发语言中的重要一个环节,使用得当,可以将整个程序的架构变得非常有弹性,减少代码冗余: 2.继承:复用定义好的类: 3.多态:可以动态调整对象的调用,降低对象 ...

  2. 字符串:格式化 - 零基础入门学习Python015

    字符串:格式化 让编程改变世界 Change the world by program 字符串:格式化 上节课我们介绍了Python字符串的N多种奇葩方法的用法,但我们唯独漏了一个format()方法 ...

  3. 拉姆达表达式 追加 条件判断 Expression<Func<T, bool>>

    public static class PredicateBuilder { /// <summary> /// 机关函数应用True时:单个AND有效,多个AND有效:单个OR无效,多个 ...

  4. iOS 6分享列表——UIActivityViewController详解

    iOS 6分享列表——UIActivityViewController详解 2013-06-03 01:42:33     发表评论 在iOS 6之后提供了一个分享列表视图,它通过UIActivity ...

  5. 【GNOME 边框】GNOME窗口无边框

    今天我新装了一台LINUX UBUNTU12.10,顺手就把UNITY换成了GNOME,但是发现边框消失. 大概原因:metacity 不同版本配置之间的冲突. 解决办法:删除home目录下的旧配置文 ...

  6. Win7+CentOS双系统,最清晰细致的教程!

    Win7的系统下安装CentOS,实现双系统切换使用的目的,希望对大家有帮助. 注意: 1.由于涉及到对硬盘操作,请妥善备份数据,避免损失. 2.我的步骤是绝对正确和缺一不可的,大家一定要按照我的操作 ...

  7. ListView 实现分组

    1:FragmentHack4.java /** * Created by y on 15-1-2. */ public class FragmentHack4 extends Fragment{ V ...

  8. java设计模式--创建型模式--抽象工厂

    什么是抽象工厂,再次学习. 抽象工厂 概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 1.一个系统要独立于它的产品的创建.组合和表示时. 2.一个系统要由多个产品系 ...

  9. log4j日志分模块打印,同时不打印到控制台上

    由于定时刷新程序的启用,导致catalina.out配置文件中打入大量日志,致使程序调试困难.          无法正常查看日志.所以客户要求将性能流量配置日志迁移出catalina.out目录.修 ...

  10. 【转】ARM Linux 3.x的设备树(Device Tree)

    原文网址:http://blog.csdn.net/21cnbao/article/details/8457546 1.    ARM Device Tree起源 Linus Torvalds在201 ...