题目:https://pintia.cn/problem-sets/17/problems/264
题解:https://www.liuchuo.net/archives/2019
自解(一次通过,但是代码显得繁琐。关键词:vector的初始化、遍历。):
#include <iostream> #include <string> #include <vector> #define Total 54 using namespace std; vector <string> cardSet; string kind[]={"S","H","C","D"}; void init(vector<string> &cardSet){ for(int j=0; j<4;j++){ for(int i =1; i<=13; i++){ string temp = kind[j]; cardSet.push_back(temp.append(to_string(i))); } } cardSet.push_back("J1"); cardSet.push_back("J2"); } void dispVec(vector<string> cardSet){ for(int i =0; i<cardSet.size()-1; i++){ cout<<cardSet[i]<<" "; } cout<<cardSet[cardSet.size()-1]<<endl; } int main() { init(cardSet); int x; cin>>x; int loc[54]; for(int i=0;i<Total;i++){ cin>> loc[i]; }//input finished vector<string> dest(Total); for(int i = 1; i <= x; i++) { for(int j=0; j < Total; j++) { dest[loc[j] - 1] = cardSet[j]; } cardSet = dest; } dispVec(cardSet); return 0; }
题解代码:通过迭代求出终态,然后用整除/、模%获得打印结果,很巧妙。
#include <cstdio> using namespace std; int main() { int cnt; scanf("%d", &cnt); int start[54], end[54], scan[54]; for (int i = 0; i < 54; i++) { scanf("%d", &scan[i]); end[i] = i; } for (int i = 0; i < cnt; i++) { for (int j = 0; j < 54; j++) { start[j] = end[j]; } for (int j = 0; j < 54; j++) { end[scan[j] - 1] = start[j]; } } char c[6] = "SHCDJ"; for (int i = 0; i < 54; i++) { printf("%c%d", c[end[i] / 13], end[i] % 13 + 1); printf("%c", i < 53 ? ' ' : '\n'); } // for(int i=0;i<53;i++){ // printf("%c%d ",c[end[i]/13], end[i]%13+1);//2 exit // } // printf("%c%d\n",c[end[53]/13], end[53]%13+1);//bad format controll return 0; }