今天在 百度知道 里也有人问起同样的问题,所以晚上在去外面吃回锅肉饭的时间想了想,用C语言的数组就很容易的搞定!!!
我的百度回答:
http://zhidao.baidu.com/question/51621358.html
思路:
从简单到复杂:
假设原来的牌在顺序是1 2 3 4 5 记作A排列
那么发完牌后的顺序是1 3 5 4 2 记作B排列
现在是要发完牌后的顺序是 1 2 3 4 5 记作C排列
首先我们要想,如果如果B排列中3是2,5是3,2是5,那么是不是最后发完牌的顺序就是1 2 3 4 5 了,所以原来的排列就是1 5 2 4 3
有了上面的想法后,就很简单了,对于13个牌的情况,把顺序为1 2 ...13的牌发完后的顺序1 3 5 7 9 11 13 4 8 12 6 2 10 和 1 2 3 ... 13 做一个变换就可以了
C语言代码如下:
#include "stdio.h"
#define LEN 13//设置扑克牌数量
int main()
{
int i,arr[LEN];
int arrS[LEN];//★★保存转换后的数据
for (i=0;i<LEN;i++)//初始化数组元素1,2,...,LEN
arr = i+1;
for (i=0;i<LEN;i++)
{
//printf("%d ",arr);//输出当前数
arrS[arr-1] = i+1;//★★★★★进行转换,这里是重点!!!
int temp;
if (i < LEN-1)
temp = arr[i+1];//保存第二个数
else
temp = arr;
for (int j=i+2;j<LEN;j++)//从第三个至尾数向前移一位
{
arr[j-1] = arr[j];
}
arr[LEN-1] = temp;//第二个数沉底
}
printf("扑克牌原排序:");
for (i=0;i<LEN;i++)
printf("%d ",arrS);//★★输出原排序
return 0;
}
运行效果:
扑克牌原排序:1 12 2 8 3 11 4 9 5 13 6 10 7 请按任意键继续. . .
对于52张牌的情况:修改#define LEN 54//设置扑克牌数量
扑克牌原排序:1 28 2 48 3 29 4 42 5 30 6 53 7 31 8 43 9 32 10 49 11 33 12 44 13 34 14 52 15 35 16 45 17 36 18 50 19 37 20 46 21 38 22 54 23 39 24 47 25 40 26 5127 41 请按任意键继续. . .
[
本帖最后由 kofeffect 于 2008-4-20 21:32 编辑 ]