洗牌C语言问题

Python056

洗牌C语言问题,第1张

1 2 3 4 5 6 7 8(假定有8张牌),牌分别是1-8,现在的次序也是1-8

5 1 6 2 7 3 8 4(第一次洗牌,把1-4的牌放入第2、4、6、8的位置,把5-8的牌放到1、3、5、7的位置)

7 5 3 1 8 6 4 2(同上,第二次洗牌,5162放到2、4、6、8 , 7384放到1、3、5、7)

整个过程如下

1    2    3    4    5    6    7    8 (原始)   

5    1    6    2    7    3    8    4    

7    5    3    1    8    6    4    2    

8    7    6    5    4    3    2    1    

4    8    3    7    2    6    1    5    

2    4    6    8    1    3    5    7    

1    2    3    4    5    6    7    8

这种小case也能上竞赛的门面上?这个问题其实很简单的啊,就只要三个函数而已。一个函数对应一种模式,扑克牌的四种花色可以用四个数组来表示,每个数组13张,再加大小王。(或者更简单的你直接都放在一个数组里。)第一个函数:随机产生四个随机数然后根据这些数字显示对应的值即可。第二个: 先产生27个随机数输出,然后在输出剩下的27张。第三个: 复制一下前面的数组,也是对应的就行。

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#define N 52 //牌张总数

#define M 13 //每花色张数

char hs[4]={5,4,3,6}//花色数组:梅花、红心、方块、黑桃字符对应的ASCII码

char hx[]={"JQKA"}// 对应11,12,13,14共四张大于10的牌符号

//生成顺序扑克牌数组: 1~52,梅花1~13,红心14~26,方块27~39,黑桃40~52

void newDeck(int *a) { int ifor ( i=0i<Ni++ ) a[i]=i+1}

//洗牌,将花色和顺序打乱

void Shuffle(int *a) { int s,i,j,t

srand((unsigned int)time(NULL))//利用当前时间生成随机数种子

s=rand()%11+5printf("随机洗牌%d遍\n",s)//第1个随机数当成洗牌次数, 洗牌次数大于等于5,小于等于15

for ( i=0i<si++ ) {

for ( j=0j<Nj++ ) {

s=rand()%52//随机数范围0~51,对应a数组下标

t=a[j]a[j]=a[s]a[s]=t//第j张牌和第s张牌交换

}

}

}

//发牌并显示

void Deal(int a[N],int b[4][M]) { int i,j

for ( i=0i<4i++ ) for ( j=0j<Mj++ ) b[i][j]=a[i*M+j]

}

//理牌

void Collating(int a[4][M]) { int i,j,k,h

for ( h=0h<4h++ )

for ( i=0i<M-1i++ )

for ( j=i+1j<Mj++ )

if ( a[h][i]<a[h][j] ) {

k=a[h][i]a[h][i]=a[h][j]a[h][j]=k

}

}

//显示

void Display(int a[4][M]) { int i,j,s

for ( i=0i<4i++ ) {

for ( j=0j<Mj++ ) {

s=a[i][j]-1printf("%c",hs[s/M])

s%=Mif ( s<9 ) printf("%d ",s+2)else printf("%c ",hx[s-9])

}

printf("\n")

}

}

void main() { int Deck[N],hands[4][M]

newDeck(Deck)//新扑克牌

Shuffle(Deck)//洗牌

Deal(Deck,hands)//发牌

Collating(hands)//理牌

Display(hands)//显示

printf("\n\n")system("pause")

}