XDOJ期末考试题
1.洗牌问题
有54张钟,牌面分别为2、3、4、5、6、7、8、9 10、J、K、A、W.其中W有2
张、包合两种花色,分别为red和that,其余牌面每种均有4张,包含四种花色,分别为
beat,spade,club,diamond.接下来执行洗牌操作,将牌的位置改变为指定位器。例有
5张牌,排列顺序为: heart-3. spade-K. dhb-10. damond-A. reds-W, 给定洗牌操作序列
{4,2,5,3,1},即把heart-3放到4号位、spade-K放到2号位、clut-10放到5号位、damond-A
放到3号位、red-W放到1号位,于是排序就变成了red-W. spade-k,diamond-A, heart-3,
club-10.加果要将上面的洗牌操作执行第2次,则最后的洗牌结果为club-10,spade-K,heart-3.
red-w,damand-A。
输入格式
第一行给出正整数N(1<N<54)表示纸牌的数量。随后N行表示N张牌的初始排列
信息,信息包括牌面和花色,以空格间隔。
接下来-行给出-一个正整数K(之100),表示洗牌操作次数;最后-行给出洗牌操作序
列,包含N个正整数,正整数取值范围在1到54之间,以空格间隔。
输出格式
输出N行,给出N张牌的最后排列结果,每行给出-张牌的牌面和花色,以空格间隔。
输入样例
5
3 heart
K spade
10 club
A diamood
w red
2
4 2 5 3 1
输出样例
10 club
K spade
3 heart
w red
A diamood
#include <stdio.h>
#include <string.h>
int main()
{
int n,b[54],m,i,j;
char a[54][10];
scanf("%d",&n);//输入牌的个数
getchar();//消除回车
for(i=0;i<n;i++)
gets(a[i]);//读入牌
scanf("%d",&m);//读入洗的次数
for(i=0;i<n;i++)
scanf("%d",&b[i]);//读入洗的顺序
int c[54];//输出顺序 起始为1 2 3 4...
for(i=0;i<n;i++)
c[i]=i;
for(j=0;j<m;j++)//洗牌循环
{
int d[54]={0};//中间数组
for(i=0;i<n;i++)
{
d[b[i]-1]=c[i];
}
for(i=0;i<n;i++)//改变输出顺序
c[i]=d[i];
}
for(i=0;i<n;i++)
puts(a[c[i]]);
}