#include <iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int a[N];
int n, firstm;
struct node
{
int num;
int password;
struct node *next;
};
class joseph
{
public:
node* Creatnode(int i, int password)
{
node* p;
p = (node*)malloc(sizeof(node));
p->num = i;
p->password = password;
p->next = NULL;
return p;
}
node* Creatjoseph(int n)
{
node* head=NULL, * p=NULL, *q=NULL;
for (int i = 1; i <= n; i++)
{
p = Creatnode(i, a[i]);
if (i == 1)
head = p;
else
q->next = p;
q=p;
}
q->next = head;
node* it = head;
for (int i = 1; i <= n; i++)
{
//cout << it->num << " " << it->password << endl;
it = it->next;
}
//cout << it->num << endl;
return head;
}
void Runjoseph(int n, int firstm)
{
node *p, *q=NULL;
p = Creatjoseph(n);
for (int i = 1; i < firstm-1; i++)
{
p = p->next;
}
q = p->next;
p->next = q->next;
p = p->next;
cout << q->num << " ";
int temp = q->password;
//cout << temp << " ";
free(q);
while (p->next!=p)
{
if (temp > 1)
{
for (int i = 1; i < temp - 1; i++)
{
p = p->next;
}
}
else
{
p = p->next;
}
q = p->next;
p->next = q->next;
p = p->next;
cout << q->num << " ";
temp = q->password;
//cout << temp <<" ";
free(q);
}
cout << p->num << endl;
}
};
int x[N];
int b[N];
void runjosephb(int x[], int m)
{
int k = 1, i = 0, cnt = a[0], count = 1 , l = n;
for (;l >= 1;)
{
if (count==cnt)
{
k = i % n;
x[k] = 1;
printf("%d ",k+1);
l--;
count = 0;
cnt = a[i%n+1];
}
i++;
if (x[i % n] != 1)
count++;
}
}
int main()
{
joseph zrx;
cout << "请输入长度和第一个人报数出圈大小" << endl;
cin >> n >> firstm;
cout << "请输入每个人所带的数大小" << endl;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
{
b[i] = a[i];
}
a[0] = firstm;
int c;
cout << "请输入构造方式? 1:数组,2:链表";
cin >> c;
if (c == 2)
zrx.Runjoseph(n, firstm);
else
{
/*for (int i = 1; i <= n; i++)
{
a[i - 1] = b[i];
}*/
for (int i = 0; i < n; i++)
x[i] = 0;
runjosephb(x,firstm);
}
//zrx.Creatjoseph(n);
return 0;
}
数据结构1 (链表) 约瑟夫
最新推荐文章于 2022-04-06 21:24:55 发布