约瑟夫环的多种实现形式

题目

约瑟夫环是算法题中简单的入门题,可以通过简单的模拟即可做出,但选用什么样的数据结构来实现是一个值得考究的问题,模板题可以找这个 洛谷P1996

PS(无聊人的无聊之语)

前段时间忙五一赛,中途似乎有入选校集训队的希望,让我高兴坏了,可惜被教练了,本身自己实力也自认为不够强就没去找他,一切还是以提升自身实力为主吧,现在通过这道简单题重新开始我的刷题博客生涯

实现(参考了洛谷题解)

1.queue

STL是c++的神器,也是解题的神器,我认为queue队列 先进先出(FIFO) 的规则是最直观的的解题思想,for循环k-1次将queue的第一个元素出队再从队尾入队(实现约瑟夫环的环状结构),第k次将队首出队不再入队,这样重复多次至没有元素

#include
using namespace std;
queue<int> q;
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		q.push(i);
	}
	while(!q.empty())
	{
		for(int i=1;i<=k-1;i++)
		{
			q.push(q.front());
			q.pop();
		}
		cout<<q.front()<<' ';
		q.pop();
	}
}

2.链表

链表的思想就是建立一个next指针,指向下一个元素,出队的方式就是将最后一个元素前一个元素的next指针指向最后一个元素的后一个指针,这样以后每次循环遍历时都会把这个元素跳过,看似它还在环里,但由于没有next指针再指向它,所以它再也无法被访问,这样就实现了出队操作

#include
using namespace std;
struct f
{
	int num;
	f *next;
}a[200];
int main()
{
	int n,k,i;
	cin>>n>>k;
	for(i=1;i<=n-1;i++)
	{
		a[i].num=i;
		a[i].next=&a[i+1];
	}
	a[i].num=i;a[i].next=&a[1];
	f* m=&a[i];
	for(i=1;i<=n;i++)
	{
		for(int j=1;j<=k-1;j++)
		{
			m=m->next;
		}
		cout<<m->next->num<<' ';
		m->next=m->next->next;
	}
}

你可能感兴趣的:(#,ACM——模拟)