ACM循环链表实现教徒问题

这篇博客介绍了17世纪加斯帕提出的教徒与非教徒海难问题,以及如何利用循环链表实现确保每次淘汰的都是非教徒的解决方案。博主给出了输入和输出格式,并提供了具体的示例,通过建立循环链表并模拟报数过程,确定正确的人选。读者可以尝试输入15,得到输出@@@@@+++++@@+@@@+@++@@+++@++@@+。
摘要由CSDN通过智能技术生成

17世纪法国数学家加斯帕在《数学的游戏问题》中讲的一个故事:n个教徒和n个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了个办法:2n个人围成一个圆圈,从第一个人开始依次循环报数,每数到第九个人就将他扔入大海,如此循环直到仅剩n个人为止 。问怎样的排法,才能使每次投入大海的都是非教徒。
【输入】 输入文件由一行构成,就是n的值。
【输出】 输出文件中是一行字符串,字符串由n个‘@’字符(代表教徒)和n个‘+’ 字符(代表非教徒)排列构成。该排列使得按照前面的约定每次投入大海的都是非教徒。
【输入范例】 15
【输出范例】 @@@@+++++@@+@@@+@++@@+++@++@@+

构建循环链表,将2n先定义为教徒赋值为@,通过指针操作链表结点寻找第九个人,将其赋值为+,若遇到已赋值为+的则跳过将其后续赋值为+,自写代码若有错误欢迎指出

代码
#include<stdio.h>/*循环链表   数组*/
#include<stdlib.h>
typedef struct dnote
{
 char data;
 struct dnote *next;
 //struct dnote *rear;
}node,*linklist;
linklist createlink(linklist L,int m,int n)/*尾插建表*/
{
node *s,*r;
int i;
L=(linklist)malloc(sizeof(node));
r=L;
 for(i=0;i<m;i++)
 {
  s=(linklist)malloc(sizeof(node));
  s->data='@';
  r->next=s;
  r=s;
 }
 s->next=L->next;//链尾指向链头
 r=L->next;//找到第九个人
while(m!=n)
 {
  i=1;
 while(i!=9)
 {
  if(r->data=='@')
  {
  i++;
  r=r->next;
  }
  else
  r=r->next; 
 }
 while(r->data=='+')
 {
 r=r->next; 
 }
 //if(r->data=='+')
 //r->next->data='+';
 //else
 r->data='+';
 m--;
 }
/*2+@@+  3+++@@@*/
 r=L->next;//输出
 for(i=0;i<(2*n);i++)
{
   printf("%c",r->data);
r=r->next;
 }
 return 0;
}
int main()
{
linklist L=NULL;
 int n,m;
 printf("输入n的值");
 scanf("%d",&n);
 m=2*n;
 createlink(L,m,n);
 return 0;   
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值