约瑟夫环问题,这是一个很经典算法,处理的关键是:伪链表
问题描述:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)
在数据结构与算法书上,这个是用链表解决的。 https://blog.csdn.net/weixin_38214171/article/details/80352921
#include <stdio.h>
#include <stdlib.h>
//#define N 10
//#define M 3
typedef struct node{
int n;
struct node *next;
}S_T;
S_T *mk_node(int n, S_T *next)
{
S_T *p = malloc(sizeof(S_T));
if(p != NULL){
p->n = n;
p->next = next;
}
return p;
}
int main(void)
{
S_T *head, *del;
int i;
int N, M;
scanf("%d %d", &N, &M);
head = mk_node(1, NULL);
head->next = head;
for(i = 2; i <= N; i++)
{
//head = head->next = creat_node(i,head->next);
head->next = creat_node(i,head->next);
head = head->next;
}
while(head != head->next)
{
for(i = 1; i < M; i++)
{
head = head->next;
}
del = head->next;
head->next = head->next->next;
printf("%d out\n", del->n);
free(del);
}
printf("%d survie\n", head->n);
return 0;
}
/*
akaedu@akaedu-G41MT-D3:~/lin/lb$ ./myysfh
10 3
3 out
6 out
9 out
2 out
7 out
1 out
8 out
5 out
10 out
4 survie*/
/*
N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#define N 20
//#define M 5
typedef struct link_node
{
int n;
// char name[64]={0};
struct link_node *next;
}LinkNode;
//LinkNode *creat_node(int num, char *strname, LinkNode *next)
LinkNode *creat_node(int num, LinkNode *next)
{
LinkNode *p = malloc(sizeof(LinkNode));
if(p != NULL)
{
p->n = num;
//strcpy(p->name,strname);
p->next = next;
}
return p;
}
int main(void)
{
int i=0;
int N=0;
int M=0;
LinkNode *head, *del;
scanf("%d %d", &N, &M);
head = creat_node(1, NULL);
head->next = head;
for(i=2; i <= N; i++)
{
//head = head->next = creat_node(i,head->next);
head->next = creat_node(i,head->next);
head = head->next;
}
while(head != head->next)
{
for(i = 1; i < M; i++)
{
head = head->next;
}
del = head->next;
head->next = head->next->next;
printf("%d out\n", del->n);
free(del);
}
printf("%d survie\n", head->n);
return 0;
}
/*
akaedu@akaedu-G41MT-D3:~/lin/lb$ ./myysfh
10 3
3 out
6 out
9 out
2 out
7 out
1 out
8 out
5 out
10 out
4 survie*/