Josephus问题(圆桌骑士)

原创 2007年09月27日 11:44:00
#define OK 1
#define ERROR 0
#include <iostream.h>
#include <malloc.h>
int N; //骑士总数
typedef int Status;
//定义循环链表
typedef struct LNode{
  int data;
  LNode *next;
}LNode,*LinkList;
//构造空循环链表
Status InitList(LinkList &L){
  L=(LinkList)malloc(sizeof(LNode));
  L->next=L;
  return OK;
}
//第i个位置之前插入元素e
Status ListInsert(LinkList &L,int i,int e){
  if(i<1) return ERROR; //插入位置不合理
  int j=0;
  LinkList p=L,s;
  while(j<i-1){ //寻找第i-1个结点
    p=p->next;
    j++;
  }
  s=(LinkList)malloc(sizeof(LNode)); //生成新结点,插入L中
  s->data=e;
  s->next=p->next;
  p->next=s;
  return OK;
}
//删除结点s
Status ListDelete(LinkList &L,LinkList &s){
  LinkList p=L;
  while((p->next)!=s){ //寻找结点s
    p=p->next;
  }
  p->next=s->next; //删除结点s
  if(s==L) L=s->next;
  free(s);
  return OK;
}
//初始化循环链表
Status PutList(LinkList &L){
  int i;
  L->data=1;
  for (i=2;i<=N ; i++){
  ListInsert(L,i-1,i);
  }
  return OK;
}
//取第i个结点的地址,赋给结点s
Status GetElem(LinkList L,int i,LinkList &s){
  if(i<1) return ERROR; //位置不合理
  int j=1;
  LinkList p;
  p=L;
  while(j<i){ //寻找第i个结点
    p=p->next;
    j++;
  }
  s=p;
  return OK;
}
//数i个结点,删除最后数的结点,返回后面结点的地址
Status ElemCount(LinkList &L,int i,LinkList &s){
  LinkList p=s;
  while(i!=1){ //数i个结点
    p=p->next;
    i--;
  }
  s=p->next; //结点s返回后面结点的地址
  cout<<p->data<<' ';
  ListDelete(L,p); //删除最后数的结点
  return OK;
}
//Josephus问题
void Josephus(int k,int m){
  int total=N;
  LinkList L,s;
  InitList(L);
  PutList(L);
  GetElem(L,k,s);
  while(total!=1){ //直到只剩一人,循环结束
    ElemCount(L,m,s);
    total--;
  }
  cout<<endl<<"留下的骑士是"<<L->data<<endl;
}
//主函数
void main(){
  int k,m;
  char flag='y';
  while(flag=='y'){
  cout<<"输入骑士个数,开始数的位置,每次数的人数:";
  cin>>N>>k>>m;
  cout<<"骑士离开的顺序为:";
  Josephus(k,m);
  cout<<"你想再试一次吗(按y继续): ";
  cin>>flag;
  cout<<endl;
  }
  cout<<"程序结束."<<endl;
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【图的连通性】poj2942圆桌骑士

题目描述:有n个骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1。2.总人数为奇数。3.有仇恨的骑士不能挨着坐。问有几个骑士不能和任何人形成任何的圆圈。这是一...

(点双联通分量模板)POJ 2942 Knights of the Round Table 圆桌骑士

Knights of the Round TableTime Limit: 7000MS Memory Limit: 65536K DescriptionBeing a knight is...
  • w4149
  • w4149
  • 2017-07-12 15:20
  • 74

【poj2942】圆桌骑士Knights of the Round Table【双连通分量】【二分图】【奇圈】

传送门:http://poj.org/problem?id=2942 尽管我承认这题我几乎是对着书抄的代码(因为我还不熟- -),但是我还是WA了三次- -数组又没清零。 基本思想就是: 首先把...

UVALive 3523 圆桌骑士

题目大意:有n个骑士经常举行圆桌会议,每次圆桌会议至少要有3个骑士参加(且每次参加的骑士数量是奇数个),且所有互相憎恨的骑士不能坐在圆桌旁的相邻位置,问有多少个骑士不可能参加任何一个会议思路,首先根据...

poj2942圆桌骑士【点双连通分量+二分图判断】

/*********** poj2942 2015.11.11-2015.11.13 不懂 暂时放下了 2015.11.18 4792K 1172MS G++ ***********/ #includ...

poj 2942 圆桌骑士 无向图割点 奇圈 交叉染色

连通类经典题 题意及分析参考: 1.建反向图 2.tarjan 算法求割点 3.二部图与奇圈 4.交叉染色 http://blog.csdn.net/lyy289065406/article/deta...

poj 2942 Knights of the Round Table 圆桌骑士(双连通分量模板题)

Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissio...

[POJ]2942 圆桌骑士 点双连通分量 + 二分图染色

#include #include #include #include using namespace std; #define clear(a) memset(a,0,sizeof(a)) #def...

Josephus问题

  • 2016-09-22 17:28
  • 837B
  • 下载

Josephus环问题

  • 2012-12-20 11:48
  • 238KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)