PAT.A1042 Shuffling Machine

返回目录

在这里插入图片描述
在这里插入图片描述

题意

题目的意思是先是54张牌按照S1-S13(黑桃1-13),H1-H13(红桃1-13),C1-C13(梅花1-13),D1-D13(方片1-13),J1-J2(小大王)排列,然后输入K,表示按照接下来的方法洗牌K次
洗牌的方法就是输入54个数字,第i个数字F[i]表示将第I张牌放到第F[i]个位置上
最后格式就是输出经过K次洗牌后的排序

以五张牌为例,之前的牌序是S1,S2,S3,S4,S5,那么给定{4,2,5,3,1}表示
将第1个位置上的牌放到第4个位置上,
将第2个位置上的牌放到第2个位置上,
将第3个位置上的牌放到第5个位置上,
将第4个位置上的牌放到第3个位置上,
将第5个位置上的牌放到第1个位置上,
结果是{S5,S2,S4,S1,S3}

注意点

  1. char s[5]={‘S’,‘H’,‘C’,‘D’,‘J’};用来建立花色与编号的关系,s[(t-1)/13]即为花色,(t-1)%13+1为编号
  2. 注意- -t和t- -的区别,- -t是在当前语句前做自减,t- -是执行完该语句
#include <bits/stdc++.h>
using namespace std;
const int N=54;
int main(){
    int K;
    scanf("%d",&K);
    int start[N+1],end[N+1],next[N+1];
    for(int i=1;i<=N;i++){
        start[i]=i;//初始化牌号
        scanf("%d",&next[i]);
    }   
    while(K--){//K次交换操作
        for(int i=1;i<=N;i++){
            end[next[i]]=start[i];
        }
        for(int i=1;i<=N;i++){
            start[i]=end[i];
        }
    }   
    char s[5]={'S','H','C','D','J'};
    for(int i=1;i<=N;i++){
        int temp=--end[i];
        int s1=(temp)/13;
        int d1=temp%13+1;
        printf("%c%d",s[s1],d1);
        if(i!=N)printf(" ");//最后一个不要输出空格
    }
    return 0;
}
发布了43 篇原创文章 · 获赞 3 · 访问量 3354

猜你喜欢

转载自blog.csdn.net/a1920993165/article/details/104327134
今日推荐