扑克牌移位和旋转

问题:编程

  •  对于一副扑克牌,咱们有多种不一样的洗牌方式。一种方法是从中间某个位置分红两半,而后相交换,咱们称之为移位(shift)。好比原来的次序是123456,从第4个位置交换,结果就是561234。这个方式其实就是数组的循环移位,为了屡次进行这个操做,必须使用一种尽量快的方法来编程实现。在本题目中,还引入另一种洗牌方式,就是把前一半(若是总数是奇数,就是(n-1)/2)牌翻转过来,这种操做称之为翻转(flip)。在前面shift操做的结果上进行flip,结果就是165234。固然,若是是实际的扑克牌,直接翻转会形成正反面混在一块儿的,咱们就无论那么多了。
            给定n张牌,初始次序为从1到n,通过若干次的shift和flip操做后,结果会是什么样?数组

  • 输入:测试

  • 输入包括多组测试数据,每组数据的第一行包括两个数 n和k。n表示牌的数目,1<n<1000,若是n为0表示输入结束,k表示下面要进行的操做数量。随后的k行,每行一个整数x,1<=x<=n,表示从第几个位置开始移位。在每一次shift操做后都接一个flip操做。code

  • 输出:ip

  • 对于输入的每组数据,计算通过给定的k次shift和flip操做后,各个位置的数值。并按次序在一行上输出全部牌张的值,每一个数值(包括最后一个)后面有一个空格。
    内存

  • 样例输入:io

  • 6 1
    4
    0 0
  • 样例输出:class

  • 1 6 5 2 3 4

时间限制:1秒          内存限制:128M循环

 

个人代码,用C语言编写,耗时10MS 内存912kb方法

#include <stdio.h>
#include <stdlib.h>
 
void swap(int *a, int *b)
{
    int tmp = *a;
    *a =  *b;
    *b = tmp;
}
 
int *fun(int *begin, int *end)
{
    int *re = begin;
    while(begin <= end)
    {
        swap(begin,end);
        begin++;
        end--;
    }
 
return re;
}
 
void fun3(int *data, int n, int p)
{
    int *re = fun(data, data+n-1);
    int *b1 = re;
    int *e1 = re+(n-p)-1;
    int *re1 = fun(b1,e1);
 
    int *b2 = e1 + 1;
    int *e2 = b2+p-1;
    int *re2 = fun(b2,e2);
 
    int *b3 = re1;
    int *e3 = re1+n/2-1;
    int *re3 = fun(b3,e3);
}
 
int main()
{
    int n,m,p;
    int *data;
    while(1)
    {
        scanf("%d %d", &n, &m);
        if(0 == n)
            break;
        else
        {
            data = (int*)malloc(sizeof(int)*n);
            int i;
            for(i = 0; i < n; i++)
                data[i] = i + 1;
            for(i = 0; i < m; i++)
            {
                   scanf("%d",&p);
                   fun3(data,n,p);
            }
            for(i = 0; i < n; i++)
                  printf("%d ", data[i]);
 
            printf("\n");
 
              free(data);
        }
    }
 
return 0;
}
相关文章
相关标签/搜索