问题概述:约瑟夫问题: n 个“猴子”(元素)围成圈,依次从1开始报数,报到3的退出,下一位接着从1开始报数,... 如此下去直到最后圈中剩下唯一的一个猴子为“大王”。
1、采用数组,报3的设置为defalt,最后检测不是defalt的返回
2、采用LIST结构,直接删除最后只剩下一个
开始遇到了一些问题,后来发现只要采用一个可以不停循环的指针来指向数值,在用一个cnt外挂计数,还是很好完成的。
只是平常的作业,不是很完善,留着参考。
private T JOS<T>(T[] arr)
{
dynamic test_defalt = default(T);
T joker = test_defalt;
int cnt = 0;
int left = 0;
if (arr.Length != 0 && arr != null)//排除1\2
{
for (int i = 0; i < arr.Length; i++)//排除3
{
dynamic t1 = arr[i];
if (t1 == test_defalt)
{
return test_defalt;
}
}
left = arr.Length;
//Console.WriteLine(left);
int j = 0;
while (left > 1)
{
if (arr[j] != test_defalt)
{
cnt++;
if (cnt % 3 == 0)
{
arr[j] = test_defalt;
left--;
}
}
j++;
if (j % arr.Length == 0)
{
j = 0;
}
}
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != test_defalt)
{
//Console.WriteLine(arr[i]);
return arr[i];
}
}
}
else
{
return joker;
}
return joker;
}
private T JOS<T> (List<T> ts)
{
T joker = ts[0];
int left = ts.Count;
int cnt = 0;
int index = 0;
while (left > 1)
{
cnt++;
if (cnt % 3 == 0)
{
ts.RemoveAt(index);
left--;
index--;
}
index++;
if (index%ts.Count==0)
{
index = 0;
}
}
return ts.First();
}