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;

POJ 2942 圆桌骑士问题。

Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 8785  ...
  • u012358934
  • u012358934
  • 2014年01月18日 18:57
  • 866

josephus问题

Josephus问题:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个人出列,然后从出列的下一个人处重新开始报数,数到第m个人又出列,……如此反复直到所有的人全部出列为止。对于任意给定的...
  • sinat_34686158
  • sinat_34686158
  • 2016年11月19日 17:20
  • 565

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

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

poj2942圆桌骑士(点双连通分量+二分图染色法判奇圈)

之前一直不明白点双连通分量能用来干嘛,比如边双连通分量可以问加几条边能变成边双连通,这个题目是这样的,每个圆桌会议至少三个骑士参加,因为需要表决意见,所以骑士数目必须是奇数个,直到那些骑士互相憎恨,也...
  • zcmartin2014214283
  • zcmartin2014214283
  • 2016年05月10日 22:03
  • 964

例题5.5 圆桌骑士 LA3523

1.题目描述:点击打开链接 2.解题思路:本题利用二分图+双连通分量解决。首先,可以把所有相互之间不憎恨的骑士连接一条无向边,那么题目转化为在这个无向图中有多少个结点不在任何一个简单奇圈上。这里的“...
  • u014800748
  • u014800748
  • 2015年09月30日 23:10
  • 408

UVALive 3523 圆桌骑士

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

POJ 2942 圆桌骑士 点双连通+二分图判定

#include #include #include #include #include #include #include #include #define N 1005 #define M 100...
  • qq574857122
  • qq574857122
  • 2014年01月14日 19:10
  • 1388

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

/*********** poj2942 2015.11.11-2015.11.13 不懂 暂时放下了 2015.11.18 4792K 1172MS G++ ***********/ #includ...
  • zhou_yujia
  • zhou_yujia
  • 2015年11月18日 09:49
  • 584

LA3523.Knights of the Round Table圆桌骑士——点双连通分量+二分图判断

http://www.bnuoj.com/v3/problem_show.php?pid=3061题目描述: 有n个骑士经常举行圆桌会议,商讨大事。每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士...
  • u014141559
  • u014141559
  • 2015年04月25日 12:10
  • 582

UVa Problem 10195 The Knights of the Round Table (圆桌骑士)

// The Knights of the Round Table (圆桌骑士) // PC/UVa IDs: 111303/10195, Popularity: A, Success rate: a...
  • metaphysis
  • metaphysis
  • 2011年11月10日 01:00
  • 1608
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Josephus问题(圆桌骑士)
举报原因:
原因补充:

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