2015/10/16/
///by XBW//
//环境 vs2013//
这是我们的数据结构的一个作业题,一个小作业之所以上博客,是希望在此mark一下,祭奠我失去的两天时光,以此警醒我要读明白题目之后再做题;先看一下被自己坑了的题目;
Home | Web Board | ProblemSet | Standing | Status | Statistics |
Problem B: 击鼓传花
Time Limit: 1 Sec Memory Limit: 2 MBSubmit: 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
#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);
}
}
心好痛
你们看了是什么感觉呢,
希望大家能简化一下程序,指出不必要的操作,或者更好的方法,谢谢大家了,以后还是读明白题再做吧