第1个回答 2012-06-14
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
#define M 4
#define INVALID -1
void xi(int A[N], int nplayer, int player[M][N])
{
int i, j, k;
int n = N;
int tmp;
if(nplayer < 2) return;
if(nplayer > M) return;
for(i = 0; i < nplayer; i ++) {
for(j = 0; j < N; j ++) player[i][j] = INVALID;
}
j = 0;
while(n > 0){
for(i = 0; i < nplayer; i ++){
k = rand()%n;
player[i][j] = A[k];
tmp = A[n-1];
A[n-1] = A[k];
A[k] = tmp;
n--;
if(n == 0) break; //not divided
}
j++;
}
}
void show(int nplayer, int player[M][N])
{
int i, j;
if(nplayer > M) return ;
for(i = 0; i < nplayer; i ++){
printf("player %d: ", i);
for(j = 0; j < N; j++){
if(player[i][j] == INVALID) break;
printf(" %d", player[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
int A[N]={1,2,3,4,1,6,7,8,9,0};
int player[M][N];
srand(time(NULL));
xi(A, 2, player);
show(2, player);
xi(A, 3, player);
show(3, player);
xi(A, 4, player);
show(4, player);
return 0;
}
第2个回答 2012-06-15
我也是学习“十步天下”算法写的如下代码,希望对你有帮助!
#include <iomanip.h>//与#include <iostream>有定义的冲突,这里是为stew()函数提供头文件
//#include <iostream>
#include <time.h>
#include <algorithm>
using namespace std;
#define NUM 52
void reset(int* data,int N)
{
for (int i=0;i<N;i++)
{
data[i]=i+1;
}
}
void prn(int* data,int N)
{
for (int i=0;i<N;)
{
cout<<setw(3)<<data[i++]<<" ";
if (i%10==0)
{
cout<<endl;
}
}
cout<<endl;
}
int SWAP_COUNTS=140;//洗牌次数,越大其排序越乱
void shuffle3(int* data, int length)
{
for(int i=0; i<SWAP_COUNTS; i++)
{
//Rand(min, max)返回[min, max)区间内的随机数
int index1 = rand()%length;
int index2 = rand()%length;
std::swap(data[index1], data[index2]);
}
}
void shuffle2(int* data, int length)
{
for(int i=1; i<length; i++)
{
int index = rand()%i;
std::swap(data[i], data[index]);
}
}
void shuffle1(int* data, int length)
{
std::random_shuffle(data, data+length);
}
void main()
{
int Data[NUM];
//算法一
cout<<"算法一:"<<endl;
reset(Data,NUM);
for (int i=0;i<NUM;i++)
{
shuffle1(Data,i);
}
prn(Data,NUM);
//算法二
cout<<"算法二:"<<endl;
reset(Data,NUM);
shuffle2(Data,NUM);
prn(Data,NUM);
//算法三
cout<<"算法三:"<<endl;
reset(Data,NUM);
shuffle3(Data,NUM);
prn(Data,NUM);
//此为算法三的牌分发,可改变上面三种的顺序,这里为最后一个算法的排序分发的
const NUMBER=4;//分牌的人数
const number=NUM/NUMBER;//每个人的牌的张数
int shuffle[NUMBER][number];
for (int j=0;j<NUMBER;j++)
{
for (i=0;i<number;i++)
{
shuffle[j][i]=Data[i*NUMBER+j];
}
}
for (j=0;j<NUMBER;j++)
{
cout<<"第"<<j+1<<"人的牌为:"<<endl;
for (i=0;i<number;i++)
{
cout<<setw(5)<<shuffle[j][i];
}
cout<<endl;
}
}