约瑟夫环以及EasyX库的应用
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<graphics.h>
#include<math.h>
#include <conio.h>
#define PI 3.1415926
int R = 250, r = 50;//R+r为起点到圆心的距离
using namespace std;
//单链表结点结构定义
typedef struct node
{
int num;//编号
int x;//圆心的x坐标
int y;//圆心的y坐标
int r;//当前圆的半径大小
node* next;
}node, *link;
node* createJoselink(int t);
node* move(node* p, int n, int step);
void deleteNextnode(node* pre, int n);
void printcircle(node *h);
void printtext(int n);
node* createJoselink(int t)
{
node *h = new node;
node *ph = h;
node *p;
for (int i = 0; i < t; i++) {
p = new node;
ph->num = i + 1;
ph->next = p;
ph->r = r;
ph->x = (r + R)*cos(2 * PI / t * i);
ph->y = (r + R)*sin(2 * PI / t * i);
if (i != t - 1)ph = p;
else ph->next = h;
}
return h;
}
node* move(node* p, int n, int step)//少循坏一次
{
while (--step) {
p = p->next;
cleardevice();
printtext(n);
printcircle(p);
setfillcolor(YELLOW);
fillcircle(p->x, p->y, r);
Sleep(1000);
}
return p;
}
void deleteNextnode(node* pre, int n)//主要输出约瑟夫环num
{
node* p = pre->next;
pre->next = p->next;
if (pre != p) {
for (int i = r; i >= 0; i--) {
cleardevice();
printtext(n);
printcircle(pre);
setfillcolor(YELLOW);
fillcircle(p->x, p->y, i);
Sleep(50);
}
}
free(p);
}
void printtext(int n) {
for (int i = 0; i < n; i++) {
TCHAR b[100];
_stprintf(b, _T("%d"), i + 1);
outtextxy((2 * r + R + 25)*cos(2 * PI / n * i), (2 * r + R + 25)*sin(2 * PI / n * i), b);
}
}
void printcircle(node *h) {
setfillcolor(CYAN);
node *p = h;
while (p->next != h) {
fillcircle(p->x, p->y, r);
p = p->next;
}
fillcircle(p->x, p->y, r);
}
int main()
{
int n, m;
cout << "请输入初始人数和报数值:";
cin >> n >> m;
initgraph(800, 800);
cleardevice();
setorigin(400, 400);
node *h = new node;
h = createJoselink(n);
node *p = h;
while (p->next != h) {
p = p->next;
}//p为h前的一个指针
for (int i = 0; i < n; i++) {
p = move(p, n, m);
deleteNextnode(p, n);
}
_getch();//按任意键退出
return 0;
}
不想说这么多,直接上干货代码