约瑟夫问题变形

 

约瑟夫问题变形

分数 10

全屏浏览

切换布局

作者 朱允刚

单位 吉林大学

编号为1…N的N个小朋友玩游戏,他们按编号顺时针围成一圈,按顺时针次序报数,从第1个人报到第M个人出列;然后再从下个人开始报到第M+1个人出列;再从下一个人开始报到第M+2个人出列……以此类推不断循环,直至最后一人出列。请编写程序按顺序输出出列人的编号。

约瑟夫问题变形_第1张图片

输入格式:

输入为2个整数,分别表示N、M(1≤N,M,K≤10000)。

输出格式:

输出为一行整数,为出列人的编号。每个整数后一个空格。

输入样例1:

6 3

输出样例1:

3 1 2 6 4 5 

 1.不能直接q->next=q->next->next,这会导致删除q之后的结点,而不是q本身所指的这个结点。

2.记得要为head指针分配空间,new一个。

下面这段代码运用循环链表,但显示会超时。

#include
using namespace std;
const int N=10010;
typedef struct node{
	int data;
	struct node *next;
}node;
int main()
{
	node *head,*tail;
	head->next=NULL;
	tail=head;
	int n,m;
	cin >> n;
	cin >> m;
	int i;
	node *q;
	for(i=1;i<=n;i++)
	{
		q=new node();
		q->data=i;
		q->next=NULL;
		tail->next=q;
		tail=q;
	}
	head=head->next;
	tail->next=head;
	q=head;
	int cnt=1;
	node *pre,*t;
	pre=head;
	while(q->next != q)
	{
		pre=q;
		q=q->next;
		cnt++;
		if(cnt==m)
		{
			cout << q->data << " ";
			t=q->next;
			pre->next=t;
			q=t;
			cnt=1;
			m++;
		}
	}
	return 0;
}

 

用数组写的代码

#include 
int main(){
	int n,m,x=-1,t=0,k; //注意因为数组下标,x 要-1
	int a[1001]={0};  //用数组判断是否出列
	scanf("%d %d",&n,&m);
	while(t!=n){  //输出n个值
		k=m; 
		while(k){
			x=(x+1)%n;
			while(a[x]!=0)
			    x=(x+1)%n; //每出列一个,都要+1
			k--;
		}
		printf("%d ",x+1);
		a[x]=1; //标记已经出列
		m++;	
		t++;
	}
}

你可能感兴趣的:(数据结构)