约瑟夫环C#解决方法
/*约瑟夫环
(问题描述)
约瑟夫问题的一种描述是:编号为1,2,......n,的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任意选
一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新
的m值,从他在顺时针方向下一个人开始从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
(基本要求)
利用单向循环链表存储结构模拟此过程,按照出列顺序印出个人的编号。
(测试数据)
m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m为6(正确的出列顺序应为6,1,4,7,2,3,5)。
下面是我的解决方法:
根据问题所描述的,这是个环问题,我们可以先模拟一个环.
声明:我这里是用双向链表的,虽然对这个问题没太大意义,但我还是保留为双向的,因为我在考虑这个问题可以衍生出很多其它问题来,只为我自己所用而以。呵呵……为了性能,而且只是解决这一个问题,你可以改成单向链表。
public class Circle
{
public class Node
{
private Node preNode;
private Node nextNode;
private int id;
private uint password;
public Node PreNode
{
get {
return preNode;
}
set {
preNode = value;
}
}
public Node NextNode {
get {
return nextNode;
}
set {
nextNode = value;
}
}
public int ID
{
get {
return id;
}
set {
id = value;
}
}
public uint Password
{
get {
return password;
}
set {
password = value;
}
}
}
private Node firstNode = null;
private Node lastNode=null;
private Node nextNode = null;
private int count = 0;
public int Count
{
get {
return count;
}
set {
count = value;
}
}
public Circle()
{
}
public void Add(int id,uint password)
{
count++;
No
补充:软件开发 , C# ,