oj之路(第一天)(續:由題目看思想)

這次的題目簡單一點,不過我的處理方式不是很恰當,卻可以從其中學習一些東西生氣!!!!!!!!!!!!!!!

=======================================================================================================

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);
	}
}

=======================================================================================================



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章