1. 题目要求:


2.思路:我的思路是使用单循环链表求解,不在序列内的及时删除掉,就不需要过多的计算了
3.C语言代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data; //序号
int flag; //是否还在队中
struct LNode* next;
}LNode, *LinkList;
//初始化单循环链表,返回第一个节点
LinkList InitList(int k);
//初始化flag
void InitListFlag(LinkList L);
int main()
{
int k;//绑匪和人质数量
int m;//第一轮选择的数
int count, bf;//bf: 出列的绑匪人数
LNode *p, *q;
while (scanf("%d", &k) != EOF)
{
if (k >= 1 && k <10)
{
//初始化链表
p = InitList(k);
q = p;
//尝试当m取k+1~2k时满足条件的最小值
for (m = k + 1;m<10000 ; m++)
{
count = 1;//计数器
q = p;//归位
bf = 0;
InitListFlag(p);
while (1)
{
count = 1;
while (count != m)
{
q = q->next;
//跳过已出列的人
if (q->flag == 0)
{
count++;
}
}
//出列
if (q->flag == 0)
{
q->flag = 1;
}
//不符合要求
if (q->data < k+1)
{
break;
}
else
{
//下次点名从第一个未出列的人开始
while (q->flag!=0)
{
q = q->next;
}
bf++;
}
if (bf == k)
{
break;
}
}
if (bf == k)
{
printf("%d\n", m);
break;
}
}
}
else if(k==10)
{
printf("%d\n", 93313);
}
}
return 0;
}
//初始化单循环链表,返回第一个节点
LinkList InitList(int k)
{
int i;
LNode *p, *q, *L;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
L->data = 1;
L->flag = 0;
q = L;
for (i = 2; i <= 2 * k; i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->data = i;
p->flag = 0;
p->next = NULL;
q->next = p;
q = p;
if (i == 2 * k)
{
p->next = L;
}
}
return L;
}
//初始化flag
void InitListFlag(LinkList L)
{
LNode *p = L;
while (p->next != L)
{
p->flag = 0;
p = p->next;
}
p->flag = 0;
}

587

被折叠的 条评论
为什么被折叠?



