数据结构之 击鼓传花

来源:互联网 发布:java项目权限管理 编辑:程序博客网 时间:2024/04/26 07:41

////////2015/10/16/////////////

///////by XBW//////////////////

//////环境  vs2013//////////

这是我们的数据结构的一个作业题,一个小作业之所以上博客,是希望在此mark一下,祭奠我失去的两天时光,以此警醒我要读明白题目之后再做题;先看一下被自己坑了的题目;

HomeWeb BoardProblemSetStandingStatusStatistics

Problem B: 击鼓传花

Time Limit: 1 Sec  Memory Limit: 2 MB
Submit: 1429  Solved: 497
[Submit][Status][Web Board]

Description

设有N个人围成一个圈,每人手里都握着一个令牌写明一个数字(随机生成的)。从第一个人开始玩“击鼓传花”游戏,第一个击的次数为其令牌上写明的数字数(假设为m1)。第m1个人出列。下次再从第m1+1个人开始新的“击鼓传花”击的次数也为其令牌上写明的次数,等于该次数的人出列。重复以上过程直到所有人都出列为止。

Input

输入第一行为测试数据组数。每组测试数据2行,第1行一个整数n(1<=n<=10000),代表人数,第2行有n个空格隔开的整数代表mi(1<=mi<=5000)。

Output

对每组测试数据输出2行,第1行为数据组数,第2行为所有人顺序出队的序列,格式见样例。

Sample Input

1
5
1 2 3 4 5

Sample Output

Case #1:
2 1 3 4

HINT

考察知识点:循环链表,时间复杂度O(sum{m}),空间复杂度O(n)


从1开始,传1次:1->2。2出列。

从3开始,传3次:3->4->5->1。1出列。

从3开始,传3次:3->4->5->3。3出列。

从4开始,传4次:4->5->4->5->4。4出列。


Append Code

[Submit][Status][Web Board]



这个就是我们的题目,就是因为没有看清楚是输出玩家手中的号码牌还是玩家的顺序,不是输出号码牌,而是输出玩家的位置;


看一下伤心的代码吧
#include <iostream>using namespace std;typedef struct LNode{int data;//玩家号码牌int caonima;//一时生气搞得变量,他就是记录玩家位置的struct LNode *next;}*LinkList;void CreatList(LinkList *L){*L = new LNode;(*L)->next = *L;(*L)->caonima = 1;}void InsertList(LinkList *L, int t)//给链表赋值{int num;int caonima = 1;LinkList p = *L, s;for (int i = 0; i < t; i++){cin >> num;s = new LNode;s->data = num;s->caonima = caonima++;s->next = p->next;p->next = s;if (p == *L)*L = s;p = p->next;}}void DestroyList(LinkList *L){LinkList q, p = (*L)->next; /* p指向头结点 */while (p != *L) /* 没到表尾 */{q = p->next;delete(p);p = q;}delete(*L);*L = NULL;}void ClearList(LinkList *L) /* 改变L */{ /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */LinkList p, q;*L = (*L)->next; /* L指向头结点 */p = (*L)->next; /* p指向第一个结点 */while (p != *L) /* 没到表尾 */{q = p->next;delete(p);p = q;}(*L)->next = *L; /* 头结点指针域指向自身 */}int main(){int N;int Counts = 0;cin >> N;while (N--){cout << "Case #" << ++Counts << ":" << endl;LinkList L;LNode *p, *q, *s;CreatList(&L);p = L;q = L;int T;cin >> T;if (T == 0){cout << endl;continue;}InsertList(&L, T);L = p;T--;int first = 1;while (T--){p = p->next;if (p == L){p = p->next;}int con = p->data;for (int i = 0; i < con; i++){if (p->next == L){p = p->next;}if (con - i == 1){q = p;}p = p->next;}if (first){cout << p->caonima;//输出位置,而不是号码牌first = 0;}else{cout << " " << p->caonima;//同上}s = q->next;//删除指针q->next = s->next;delete(s);p = q;}cout << endl;ClearList(&L);DestroyList(&L);}}
心好痛
你们看了是什么感觉呢,
希望大家能简化一下程序,指出不必要的操作,或者更好的方法,谢谢大家了,以后还是读明白题再做吧

1 0
原创粉丝点击