trao bai

Màu nền
Font chữ
Font size
Chiều cao dòng

Giả thiết có 2n lá bài, đánh số từ 1 đến 2n. Ban đầu các lá bài được sắp theo thứ

tự từ 1 đến 2n. Quy tắc tráo bài là như sau: sau một lần tráo bài từ trật tự ban đầu ta

có trật tự các bài là n+1, 1, n+2, 2, . . . ,2n, n. Như vậy, n lá bài đầu tiên sẽ nằm ở

các vị trí 2, 4, 6, . . . , 2n. Các lá bài còn lại sẽ ở các vị trí lẽ: 1, 3, 5, . . ., 2n-1. Với

số nguyên n cho trước, sau một số lần tráo, ta lại nhận được trình tự ban đầu của bộ

bài. Hãy lập trình xác định số lần tráo để có lại trình tự ban đầu và liệt kê các trạng

thái sau các lần tráo (cả trạng thái ban đầu)

#include <stdio.h>  

#include <stdlib.h>  

#include <math.h>  

void display(int a[], int n)  

{  

    static count = 0;  

    printf("

%d:\t", count ++);  

    for (int k = 0; k < 2*n; k ++) printf("%d\t",a[k]);  

}  

void swapone(int a[], int n)  

{  

    int *b = (int *) malloc(2*n*sizeof(int));  

    int k;  

    for (k = 0; k < n; k ++) b[2*k+1] = a[k];  

    for (k = 0; k < n; k ++) b[2*k] = a[k + n];  

    for (k = 0; k < 2*n; k ++) a[k] = b[k];  

    free (b);  

    display(a,n);  

}  

bool compare(int a[], int b[], int n)  

{  

    for (int k = 0; k < 2*n, a[k] == b[k]; k ++);  

    return k == 2*n;  

}  

void swap(int a[], int n)  

{  

    int *b = (int *) malloc(2*n*sizeof(int));  

    for (int k = 0; k < 2*n; k ++) b[k] = a[k];  

    display(a,n);  

    do   

        {  

            swapone(a,n);  

        }    while (!compare(a,b,n));  

    free (b);  

}  

void main()  

{  

    int a[10] = {1,2,3,4,5,6,7,8,9,10};  

    swap(a,5);  

}

Bạn đang đọc truyện trên: Truyen2U.Pro