约瑟夫算法

#include "stdio.h"
#include "stdlib.h"

void main()
{
  char players[20][20]; 
  int isOut[20];
  int i;
  int count=0;
  int num;
  int start;
  int flag=0;
  int outNum=0;

  printf("请输入参加出圈游戏人员名单:\n");
  for(i=0;i<20;i++)
  {
	  printf("第%d位:",i+1);
	  scanf("%s",players[i]);
	  if(players[i][0]=='!')
		  break;
	  count++;

  } 
    printf("请输入出圈数字:");
	scanf("%d",&num);
	printf("请输入起始位置:");
	scanf("%d",&start);
	printf("共有%d人参加, 出圈数字是:%d, 起始位置是(%d):%s\n",count,num,start,players[--start]);
    printf("开始游戏…\n");
	for(i=0;i<20;i++)
	{
		isOut[i]=1;
	}
	
      	
		   do
		   {
			   if(start==count)     // 如果循环一周则从零开始!
			       start=0;

				if(isOut[start]!=0)    //检测是否出圈,否则
					flag++;
				if(flag==num)
				{
					isOut[start]=0;
					printf("%s 出圈\n",players[start]);
					outNum++;
					flag=0;
				}
				start++;
					
		   }while(outNum<count);
	  
}

 

public class Josephus {
    static class Node{
    	int val;
    	Node next;
    	Node(int v){
    		val=v;
    		}    	
    }//成员类,代表节点,类似于数据结构中的结构体
	public static void main(String[] args) {
		int N=9;//这个表示总人数
		int M=5;//数到几的人出列
		Node t=new Node(1);//头节点单列出来,方便形成循环链表
		Node x=t;
		
		for(int i=2;i<=N;i++)x=(x.next=new Node(i));//建立单向链表
		x.next=t;//最后一个节点的next指向第一个节点,形成循环链表
		System.out.println("出圈的顺序为:");
		while(x!=x.next){
			for(int i=1;i<M;i++)
				x=x.next;
                       //此时x是将出列的节点的前一个节点
			System.out.print(x.next.val+" ");
			x.next=x.next.next;
		}
		System.out.println();
	    System.out.println("Survivors is "+x.val);	
	}//end main
}

 

你可能感兴趣的:(数据结构,游戏,算法)