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