文章

10

粉丝

165

获赞

7

访问

26.4k

头像
P1366 怪异的洗牌解析
P1366 吉林大学机试题
发布于2023年3月27日 16:31
阅读数 2.0k

#include <stdio.h>
int a[1002];
void init(){//初始化扑克牌数组
    for(int i=0;i<1002;i++){
        a[i]=i;
    }
}
//数组a[] = 0123456.....
void reverse(int left,int right){//右减去左+1为数组串长度
//翻转函数,第一个和最后一个换,第二个和倒数第二个换123456变成654321
    int temp;
    for(int i=0;i<(right-left+1)/2;i++){
        temp = a[left+i];
        a[left+i]=a[right-i];
        a[right-i] = temp;
    }
}
void shift(int n,int x){//用三次reverse实现交换后面和前面的数
    reverse(1,x);
    reverse(x+1, n);
    reverse(1,n);
}
void flip(int n){//翻转,将前一半数翻转,分成两种情况,一个是偶数n/2,一个是奇数(n-1)/2
    if(n%2==0){
        reverse(1,n/2);
    }
    else{
        reverse(1,(n-1)/2);
    }
}
int main(){
    int n,k,p;
    while(scanf("%d %d",&n,&k)!=EOF){
        init();
        if(n==0){
            break;
        }
        for(int j=0;j<k;j++){
            scanf("%d",&p);
            shift(n, p);
            flip(n);
        }
        for(int i=1;i<=n;i++){
            printf("%d "...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发