最近看到一个题是这样的
实现一个算法: 将一副54张扑克牌经过洗牌后顺序发给三个人,然后将每个人的牌按降序排序。
自己实现了一下,代码如下:
Card.h
#ifndef CARD_H
#define CARD_H
#include <string>
using namespace std;
//扑克牌类
class Card
{
public:
int suit; //花色
int rank; //点数
//枚举依次代表点数{3,4,5,6,7,8,9,10,J,Q,K,A,2,小王,大王}
enum{THREE=0,FOUR=1,FIVE=2,SIX=3,SEVEN=4,EIGHT=5,NINI=6,TEN=7,
JACK=8,QUEEN=9,KING=10,ACE=11,DEUCE=12,BLACK=13,RED=14};
//枚举依次代表花色{方块,梅花,红桃,黑桃,王}
enum{DIAMOND=0,CLUB=1,HEART=2,SPADE=3,JOKER=4};
private:
static const string SUIT_NAMES[5];
static const string RANK_NAMES[15];
public:
Card() {}
Card(int s,int r):suit(s),rank(r) {}
string toString();
};
#endif
/*****************************************************/
Card.cpp
#include <iostream>
#include "Card.h"
const string Card::SUIT_NAMES[] = {"方块","梅花","红桃","黑桃",""};
const string Card::RANK_NAMES[] = {"3","4","5","6","7","8","9","10","J",
"Q","K","A","2","小王","大王"};
string Card::toString()
{
return SUIT_NAMES[suit] + RANK_NAMES[rank];
}
/*****************************************************/
//算法类
Game.h
#ifndef GAME_H
#define GAME_H
#include "Card.h"
using namespace std;
class Game
{
public:
//洗牌函数,把一副牌的次序随机打乱
void shuffle(Card *cards,int len);
//发牌函数,第一个数组是洗牌后的结果,第二个数组是二维数组
//的首地址,num是人数。发牌的时候每个人的牌都要做排序
void deal(Card *cards,int len,Card *ret,int num);
};
#endif
/*****************************************************/
Game.cpp
#include "Game.h"
//洗牌函数
void Game::shuffle(Card *cards,int len)
{
srand(time(0));
for(int i = len-1; i>=1; i--)
{
int j = rand()%i;
Card temp = cards[i];
cards[i] = cards[j];
cards[j] = temp;
}
}
//排序函数(冒泡)
void sort(Card *array,int len)
{
assert(array!=NULL && len>0);
int i,j;
bool flag = true;
for(i=0; i<len-1 && flag; i++)
{
flag = false;
for(j=len-2; j>=0; j--)
{
if((array+j)->rank < (array+j+1)->rank)
{
Card temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = true;
}
}
}
}
//发牌函数
void Game::deal(Card *cards,int len,Card *ret,int num)
{
assert(cards!=NULL && ret!=NULL && len>0 && num>1);
int sum = len/num;
int i,j;
for(i=0,j=0; i<sum; i++)
{
ret[i] = cards[j++];
ret[sum+i] = cards[j++];
ret[2*sum+i] = cards[j++];
}
for(i=0;i<num; i++)
{
sort(ret+i*sum,sum);
}
}
/*****************************************************/
//测试代码
Main.cpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include "Game.h"
using namespace std;
int main()
{
Card *cards = new Card[54];
int i=0,j=0;
int rank,suit;
for(rank = Card::THREE; rank <= Card::DEUCE; rank++)
{
for(suit = Card::DIAMOND; suit <= Card::SPADE; suit++)
{
(cards+i)->suit = suit;
(cards+i)->rank = rank;
i++;
}
}
(cards+i)->suit = Card::JOKER;
(cards+i)->rank = Card::BLACK;
i++;
(cards+i)->suit = Card::JOKER;
(cards+i)->rank = Card::RED;
//洗牌
Game *game = new Game;
game->shuffle(cards,54);
cout<<"一副扑克牌"<<endl;
cout << "[";
for(i=0; i<54; i++)
{
cout << cards[i].toString();
if(i!=53)
cout << ",";
}
cout <<"]"<< endl;
//发牌
Card res[3][18];
game->deal(cards,54,(Card*)res,3);
cout<<"发牌之后"<<endl;
for(i=0;i<3;i++)
{
cout << "[";
for(j=0;j<18;j++)
{
cout << res[i][j].toString();
if(j!=17)
cout<<",";
}
cout <<"]"<< endl;
}
return 0;
}
测试程序运行结果如下: