hdu1443(约瑟夫环游戏的原理 用链表过的)
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.
4
0
30
#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(约瑟夫环游戏的原理 用链表过的)的更多相关文章
- 简单约瑟夫环的循环单链表实现(C++)
刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...
- 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用
什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...
- 约瑟夫环问题 --链表 C语言
总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...
- 约瑟夫环(Joseph)的高级版(面向事件及“伪链表””)
约瑟夫环问题: 在一间房间总共有n个人(下标0-n-1),只能有最后一个人活命. 按照如下规则去杀人: 所有人围成一圈 顺时针报数,每次报到q的人将被杀掉 被杀掉的人将从房间内被移走 然后从被杀掉的下 ...
- 约瑟夫环问题的链表解法和数学解法(PHP)
约瑟夫环问题 一群猴子排成一圈.按1,2,-,n依次编号.然后从第1仅仅開始数,数到第m仅仅,把它踢出圈.从它后面再開始数,再数到第m仅仅.在把它踢出去-.如此不停的进行下去.直到最后仅仅剩下一仅仅猴 ...
- Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)
1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...
- 单向环形链表解决约瑟夫环(Josephus)问题
一.约瑟夫环问题 Josephu 问题为:设编号为1,2,- n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那 ...
- C语言链表实现约瑟夫环问题
需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...
- C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...
随机推荐
- 编译Boost 详细步骤
vs2008编译boost [一.Boost库的介绍] Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会 ...
- :before与:after伪类的应用
1.小三角样式
- open_basedir restriction in effect. File() is not within the allowed path(s)
目前发现eaccelerator安装之后如果php.ini中设置open_basedir将导致open_basedir的一些报错(open_basedir restriction in effect. ...
- poj 1037 A decorative fence
题目链接:http://poj.org/problem?id=1037 Description Richard just finished building his new house. Now th ...
- UIAppearance使用详解-备
iOS5及其以后提供了一个比较强大的工具UIAppearance,我们通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格,它提供如下 ...
- 云风:我所偏爱的C语言面向对象编程范式
面向对象编程不是银弹.大部分场合,我对面向对象的使用非常谨慎,能不用则不用.相关的讨论就不展开了. 但是,某些场合下,采用面向对象的确是比较好的方案.比如 UI 框架,又比如 3d 渲染引擎中的场景管 ...
- github在eclipse中的配置
http://www.cnblogs.com/yejiurui/archive/2013/07/29/3223153.html http://blog.csdn.net/shehun1/article ...
- Resharper上手指南
原文http://www.cnblogs.com/renji/archive/2007/12/11/resharper.html Resharper上手指南 我是visual studio的忠实用户, ...
- windows下搭建NFS服务器
Win7除了旗舰版和企业版其他版本没有NFS客户端,windows2000,windowsXP,windows2003有个sfu(windows services for unix)工具貌似比较强大, ...
- LeetCode198 House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...