1 洗牌问题(Card Shuffle Problem)
洗牌问题(Card Shuffle Problem)的基本描述
你有 100 张牌,从 1 到 100。
你把它们分成 k 堆,然后按顺序收集回来。
例如,如果您将它们分成 4 堆,那么第一堆将包含编号为 1、5、9、…的卡片,
第四堆将包含编号为 4、8、12、…在收集您首先收集的卡片时,
将最后一堆从下往上翻,然后拿起第三堆,从下往上翻,将卡片放在第四堆的上面,以此类推。
下一轮,你将牌分发到另一组牌堆中,并以同样的方式收集(最后一堆先,第一堆后)。
如果我们有 10 张牌,并把它们分成 2 堆,
牌堆中的牌的顺序(从上到下)将是 9、7、5、3、1 和 10、8、6、4、2 我们翻转牌堆,
得到顺序 1、3、5、7、9 和 2、4、6、8、10 我们把第二堆放在底部,
第一堆放在顶部,得到一副牌 1、3、5、7、9、2、4, 6、8、10 给定回合数(m),
每回合的桩数(ki),你需要写一个程序,在最后一轮结束时从顶部找到第 n 张牌。
2 源程序
using System;
using System.Collections;
using System.Collections.Generic;
namespace Legalsoft.Truffer.Algorithm
{
public static partial class Algorithm_Gallery
{
private static int CARDS = 100;
private static void Current_Round(List<int> list, int totalPiles)
{
int i;
List<List<int>> piles = new List<List<int>>();
for (i = 0; i < totalPiles; i++)
{
piles.Add(new List<int>());
}
int j = 0;
for (i = 0; i < CARDS; i++)
{
piles[j].Add(list[i]);
j = (j + 1) % totalPiles;
}
int pileNo = 0;
i = 0;
j = 0;
while (i < CARDS)
{
list.Insert(i, piles[pileNo][j]);
j++;
if (j >= piles[pileNo].Count)
{
pileNo++;
j = 0;
}
i++;
}
}
public static int Perform_Rounds(int[] piles, int rounds, int n)
{
List<int> list = new List<int>();
for (int i = 1; i <= CARDS; i++)
{
list.Add(i);
}
for (int i = 0; i < rounds; i++)
{
Current_Round(list, piles[i]);
}
return list[n];
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
namespace Legalsoft.Truffer.Algorithm
{
public static partial class Algorithm_Gallery
{
private static int CARDS = 100;
private static void Current_Round(List<int> list, int totalPiles)
{
int i;
List<List<int>> piles = new List<List<int>>();
for (i = 0; i < totalPiles; i++)
{
piles.Add(new List<int>());
}
int j = 0;
for (i = 0; i < CARDS; i++)
{
piles[j].Add(list[i]);
j = (j + 1) % totalPiles;
}
int pileNo = 0;
i = 0;
j = 0;
while (i < CARDS)
{
list.Insert(i, piles[pileNo][j]);
j++;
if (j >= piles[pileNo].Count)
{
pileNo++;
j = 0;
}
i++;
}
}
public static int Perform_Rounds(int[] piles, int rounds, int n)
{
List<int> list = new List<int>();
for (int i = 1; i <= CARDS; i++)
{
list.Add(i);
}
for (int i = 0; i < rounds; i++)
{
Current_Round(list, piles[i]);
}
return list[n];
}
}
}