這次的題目簡單一點,不過我的處理方式不是很恰當,卻可以從其中學習一些東西!!!!!!!!!!!!!!!
=======================================================================================================
Description
ACM隊員去其它城市參加亞洲區預賽往往要坐10多個小時的火車。在車上爲了打發時間,有時他們也玩紙牌。下面是一個關於發牌的問題。
現有發牌人手上有N張牌,先把放在最上面的牌放到桌上,接着把剩下的N-1張牌最上面的一張取出放到這疊牌的最下面。這樣算完成了一次操作。接着再次將最上面一張放到桌上,把剩下的N-2張牌最上面的一張取出放到最下面……直到最後一張牌被放到桌面上。
舉個例子:
一開始手上的牌分別是1,2,3,4,(從上到下),先把1放在桌上,然後把2放在4的後面,所以手上的牌就是3,4,2了,接着把3放在桌上,把4放在2的後面,這時手上的牌就是2,4了,不斷重複這個過程,直到手上的牌都放到桌面爲止。
現在,如果告訴你牌的總數N(編號爲1到N),以及最終這N張牌放到桌面上的順序正好是1,2,3,….,N。
問最開始放在手上的那N張牌的順序!!
輸入格式
多行,一行一個正整數N。(1
輸出格式
每行一個排列,數與數之間用空格隔開。
輸入樣例
2
3
0
輸出樣例
1 2
1 3 2
=======================================================================================================
=======================================================================================================
#include <stdio.h>
#include <stdlib.h>
typedef struct QNode
{
int n;
int *data;
int *front;
int *rear;
}QNode, *Queue;
int PopQueue(Queue Q)
{
int tmp = *Q->front++;
if (Q->front == Q->data + Q->n)
Q->front = Q->data;
return tmp;
}
void PushQueue(Queue Q, int tmp)
{
*Q->rear = tmp;
++Q->rear;
if (Q->rear == Q->data + Q->n)
Q->rear = Q->data;
}
void PrintQueue(Queue Q)
{
Q->front--;
if (Q->front == Q->data -1)
Q->front = Q->data + Q->n - 1;
while (Q->front != Q->rear) {
printf("%d ", *Q->front--);
if (Q->front == Q->data - 1)
Q->front = Q->data + Q->n - 1;
}
printf("%d ", *Q->rear);
printf("\n");
}
int main()
{
Queue Q = (Queue)malloc(sizeof(QNode));
int n, tmp;
while (scanf("%d", &n) && n != 0){
//初始化
Q->data = (int *)malloc( n * sizeof(int));
Q->front = Q->data;
Q->rear = Q->data;
Q->n = n;
for (int i = n; i > 1; --i) {
PushQueue(Q, i);
tmp = PopQueue(Q);
PushQueue(Q, tmp);
}
PushQueue(Q, 1);
PrintQueue(Q);
//收工
free(Q->data);
}
}
=======================================================================================================