基础编程题之洗牌
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础编程题之洗牌相关的知识,希望对你有一定的参考价值。
题目
解题思路
题目看似复杂,但是十分简单。关键就在于搞清左手牌和右手牌如何摆放的问题
根据题目的意思,使用数组保存牌,第一次洗牌完成后结果如下
可以对比洗牌前后,左手牌和右手牌的位置关系为
原数组中位置为i的左手牌放到了新位置为2*i处,比如说原数组中左手牌3,其下标为2,放到了2*2的位置,即4
原数组中位置为i+n的右手牌放到了新位置1位2*i+1处,比如说原数组中的右手牌5,其下标为4,也就是1+3,放到了2*1+1,即下标为3的位置
根据以上叙述,即可写出代码,需要注意的是输入和输出的格式
代码
#include <iostream>
#include <vector>
using namespace std;
void shuffle(vector<int>& card,int n,int k)
{
while(k--)
{
vector<int> temp(card.begin(),card.end());
for(int i=0;i<n;i++)
{
card[2*i]=temp[i];//左牌
card[2*i+1]=temp[i+n];//右牌
}
}
}
int main()
{
int group;//有几组数据
cin>>group;
while(group--)
{
int n;//2*n张牌
int k;//洗牌多少次
cin>>n>>k;
vector<int> card;
card.resize(2*n,0);
for(int i=0;i<2*n;i++)//赋值
{
cin>>card[i];
}
shuffle(card,n,k);
for(int i=0;i<2*n;i++)
{
if(i==2*n-1)
{
cout<<card[i]<<endl;
}
else
{
cout<<card[i]<<" ";
}
}
}
}
以上是关于基础编程题之洗牌的主要内容,如果未能解决你的问题,请参考以下文章