题目:已知扑克牌的洗牌手很有技巧,可以决定每次洗牌时排位的变化,起始状态排序为确定;
现在已知洗牌的不同方法(洗牌前和洗牌后的位置映射),给出洗牌时采用的方法的序列;
预测最后的牌形。
分析:模拟。制作映射表,按照洗牌的策略序列调用,最后输出对应位置的牌即可。
说明:关键是读懂题目,(⊙v⊙)嗯。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char suit[4][10] = {"Clubs", "Diamonds", "Hearts", "Spades"};
char value[13][10] = {"2", "3", "4", "5", "6", "7", "8", "9", "10",
"Jack", "Queen", "King", "Ace"};
int card[53], buf[53];
int shuffle[101][53];
void perform(int id)
{
for (int i = 1; i <= 52; ++ i) {
buf[i] = card[shuffle[id][i]];
}
for (int i = 1; i <= 52; ++ i) {
card[i] = buf[i];
}
}
int main()
{
int m, n;
while (~scanf("%d", &m))
while (m --) {
scanf("%d", &n);
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= 52; ++ j) {
scanf("%d", &shuffle[i][j]);
}
}
for (int i = 1; i <= 52; ++ i) {
card[i] = i;
}
char str[101];
int id;
getchar();
while (gets(str) && str[0]) {
sscanf(str, "%d", &id);
perform(id);
}
for (int i = 1; i <= 52; ++ i) {
int v = card[i]-1;
printf("%s of %s\n", value[v%13], suit[v/13]);
}
if (m) {
puts("");
}
}
return 0;
}