XDOJ期末考试题

XDOJ期末考试题

1.洗牌问题

54张钟,牌面分别为23456789 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, 给定洗牌操作序列
{
     42531},即把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个正整数,正整数取值范围在154之间,以空格间隔。
输出格式
输出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 
#include 
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]]);

 } 

你可能感兴趣的:(c#,算法)