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
#include<stdio.h>#include<stdlib.h>
#include<time.h>
int n,a[20],b[20],c[20],n2
void init()
{int i,j,k,t
for(i=0i<n2i++)
a[i]=i+1
srand(time(0))
for(i=0,j=n2i<jj--)
{k=rand()%j
t=a[j-1]a[j-1]=a[k]a[k]=t
}
for(i=0i<n2i++)
c[i]=a[i]
}
void prt()
{for(int i=0i<n2i++)
{printf("%3d",a[i])
if(i==n-1)printf(" ||")
}
printf("\n")
}
void work()
{int i,t
for(i=1i<n2-1i++)
{t=i<n?i+i:(i+i)%n2+1
b[t]=a[i]
// printf("b[%d]=a[%d]\n",(i+i)%n2+1,i)
}
for(i=1i<n2-1i++)
a[i]=b[i]
}
bool done()
{for(int i=1i<n2i++)
if(a[i]!=c[i])return false
return true
}
int main()
{scanf("%d",&n)
n2=n+n
init()
prt()
do
{work()
prt()
}while(!done())
return 0
}
洗牌就随机排序的问题,所以就需要使用库函数rand(),或者自己编写一个伪随机数来实现。
C++里STL里有一个函数random_shuffle()就能实现这样的功能。
#include <stdlib.h>#include <time.h>
#include <stdio.h>
// 洗牌函数
void random_shuffle(int * array, int len)
{
int * p = array, temp, pos
for (int i = 1 i < len ++i)
{
pos = rand() % i
temp = *p
*p++ = array[pos]
array[pos] = temp
}
}
// 显示函数
void print(int * array)
{
int i
const char sign1[][4] = {"红", "黑", "方", "草"}
const char sign2[][4] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}
for(i=0 i<52 ++i)
{
printf("%s%2s ", sign1[array[i] / 13], sign2[array[i] % 13])
if(i % 13 == 12) printf("\n")
}
printf("\n")
}
int main()
{
srand(time(NULL)) // 初始化随机数
int card[52], i
for(i=0 i<52 ++i) card[i] = i // 初始化牌
print(card)
random_shuffle(card, 52) // 洗牌
print(card)
return 0
}