扑克牌问题(C语言)

小明刚学会一个魔术:有13张扑克牌,A,1,2,3,4,5,6,7,8,9,10,J,Q,K
扑克牌先按他预先设计的方法排序,只见他从下边拿出一张放到最上面,又从最下边拿出一张放到桌上是A,然后又从下边拿出一张放到最上面,又从最下边拿出一张放到桌上是2 ……依此类推,直到手里只有一张牌,翻开放到桌上正好为K。
求一开始小明手中扑克牌的顺序。。。要C语言程序哦!先谢谢了~~~

(由此可见出牌顺序为A---K)

(1)先建立一个数组 int str1[13] //用途是每张牌出来的原来位置倒序的。
(2)建立一个数组 char str_card[13];保存倒序扑克牌位置
(2)建立一个单链表内容是int data 从头倒尾值为1---13,头结点不算,*next指向下一个节点,最后一个指向NULL;(
(3)(i_str用于数组的计数器,i_card_order=0(链表标志符,0就A,1就B(AB就是下面的步骤)),还要一个专门指向尾节点的指针,末尾接移位节点的时候用)
(4)operate:A:把第一个带值的节点移位到最后 i_card_order=1。
B:下一个节点成为了第一个节点,把data保存到str1[i_str];i_str++;
i_card_order=0。
删除当前节点。
(5)重复3,4步,最后把A----K,与0---12对于(两数组),结果就出来了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-08
先定义一个数组before【12】保存原始牌状态。

为了简化问题,A用0代替,jqk以此类推哈。

然后 逆推,移动数组,删除元素。追问

差不多能明白一点了,能给个程序或者算法什么的吗?

第2个回答  2012-04-08
我有个能发牌的,不知道你的具体要求
//随即发牌程序,当输入小于等于0时推出发牌
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#include <string.h>
#define NUMBER 13
#define COLOR 4
#define KIND 3
int main()
{
int col,num,i,n,j,kind;
int count=0;
int ns=0;
int scount=0;
const char number[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
const char color[]={'B','R','C','H'};
bool p[COLOR][NUMBER]={false};
srand((unsigned) time(NULL));
printf("随即发牌程序,当输入小于等于0时,推出发牌!\n");
while(1)
{
char ch;
scount++;
if(scount>20)
return 0;
printf("请输入需要发的牌的张数:");
scanf("%d",&n);
if(n<=0)
{
return 0;
}
if(n>52)
{
printf("你输入的数大于一副牌的张数!\n");
continue;
}
if((count+n)>=52)
{
for (i=0;i<COLOR ;i++ )
{
for (j=0;j<NUMBER ; j++)
{
p[i][j]=false;
count=0;
}
}
}
for (ns=0;ns<n ; )
{
col=rand()%COLOR;
num=rand()%NUMBER;
if(p[col][num]==false)
{
p[col][num]=true;
ns++;
count++;
}else
{
continue;
}
switch(col)
{
case 0: printf("黑桃");break;
case 1: printf("红桃");break;
case 2: printf("方块");break;
case 3: printf("红心");break;
default:printf("error!\n");
return;
}
if(num==8)
{
printf("10\t");
}else
printf("%c\t",number[num]);
if (ns%10==0)
{
printf("\n");
}
}
printf("\n");
}
printf("\n");
return 0;
}本回答被网友采纳
第3个回答  2012-04-08
真会玩追问

这是软件大赛的一道原题~我没做出来啊!!!