撲克牌移位和旋轉

問題:編程

  •  對於一副撲克牌,咱們有多種不一樣的洗牌方式。一種方法是從中間某個位置分紅兩半,而後相交換,咱們稱之爲移位(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;
}
相關文章
相關標籤/搜索