约瑟夫环
约瑟夫环
很老的问题了
这是问题描述
设有编号为1,2,…,n的n(n>0)个人围成一个圈,每个人持有一个密码m。从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。
基本要求
建立模型,确定存储结构。
对任意n个人,密码为m,实现约瑟夫环问题。
出圈的顺序可以依次输出,也可以用一个数组存储。
呃 大致就是这样了
这是代码
#include<iostream>
using namespace std;
struct mod
{
mod* next;
int num;
};
//结构体的定义,数据结构,个人感觉就是为了处理问题方便来设置的物理上的实体,就是把抽象的问题用具体的模型来代替.在这里就是一个链条,一个接一个连着,好像是一群人手拉手,num代表着这个人的姓名,next就代表着彼此间拉着的手。
void handinhand(int n,mod*p)
{
for(int i=0;i<n;i++)
{
p[i].next=&p[i+1];
}
p[n-1].next=&p[0];
}
mod *baoshu(int m,mod*b)
{
int i=0,num=1;
mod*odd=b;
mod*now=b->next;
while(num!=m)
{
num++;
odd=now;
now=now->next;
}
return odd;
}
void chuju(mod*ood,int i,int last)
{ mod*l=ood;
cout<<"--------在第"<<i<<"轮游戏中---------\n"
<<ood->next->num<<"玩家 出局\n";
ood->next=ood->next->next;
for(int i=1;i<last;i++)
{
cout<<l->num<<" ";
l=l->next;
}
cout<<"活着\n";
}
int main()
{
int n,m,i1,i=1;
mod*odd;
int last;
cout<<"有几个人参加\n";
while(!(cin>>n)||n<=0)
{
cin.clear();
while(cin.get()!='\n')
continue;
cout<<" W R O N G \n"<<"请输入一个大于0的整数\n";
}
cout<<"密码是\n";
while(!(cin>>m)||m<0)
{
cin.clear();
while(cin.get()!='\n')
continue;
cout<<" W R O N G \n"<<"请输入一个大于0的整数\n";
}
mod p[n];
last=n;
for(i1=1;i1<=n;i1++)
p[i1-1].num=i1;
handinhand(n,p);
odd=p[n-2].next;//初始化 从第一个人开始
while(last>1)
{
odd=baoshu(m,odd);
chuju(odd,i,last);
i++;
last--;
}
cout<<"------------------gameover-------------\n";
}
大致来说就是蛮简单的
运行了一下