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 <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]]);

 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章