简单模拟

c/c++简单模拟:坏人出列(猴子报数)
题目大致意思:给定n个人围坐成一个圆(序号分别为1-n),报道m的人出列,接着下一个继续从1开始报数,如此循环,直到剩下最后一个,求出列顺序。
代码如下:
#include< iostream >
#include < cstring >
const int MAXN=1000;
using namespace std;
int a[MAXN];
void init(int n){//初始化:编号
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
a[i]=i;
}
void emulate(int n,int m){
init(n);
int i=0,j,temp;
while(n){
i=((i+m)%n==0)?n:(i+m)%n; //特殊情况是(i+m)%n=0时,i=n;
temp=a[i];//出列
for(j=i+1;j<=n;j++)//覆盖已经出列的“节点”
a[j-1]=a[j];
a[n]=temp;//这里采用倒序存储出列顺序,自然输出时反向输出,也可以考虑c++的stl
i–;n–;//i重新开始,总数减少一个
}
}
int main(){
int n,m;//默认是m<=n
cin>>n>>m;
emulate(n,m);
for(int i=n;i>0;i–)
cout<< a[i] <<” “;
return 0;
}
接下来是链表描述:

# include< iostream >
# include< cstdlib >
using namespace std;
typedef struct Node{
int num;
struct Node *next;
}LNode,*List;
int n,m;
void create_list(List &head){//头结点不为空
head=new LNode;
List tail,node;
tail=head=NULL;
for(int i=1;i<=n;i++){
node=new LNode;
node->num=i;
node->next=NULL;
if(!head){
head=tail=node;
}
else{
tail->next=node;
tail=node;
}
tail->next=head;
}
}
void emulate(List head){
if(head->next==head){
cout< < head->num< < endl;
return;
}
for(int j=1;j < m-1;j++)//因为单链表没有向前回溯的功能,故在前一个节点,就要标记进行删除操作
head=head->next;
List goal=head->next,temp=goal->next;
cout< < goal->num< < ” “;
head->next=temp;
delete goal;
emulate(head->next);
}
int main(){
cin>>n>>m;
List head;
create_list(head);
emulate(head);
return 0;
}
最后给这个问题加上一个变种方式:即一共有n(1~n)个好人和n(n+1~2n)个坏人,我要求得一个最小正整数k,使得坏人全都是位于n+1~2n的。
分析:我们可以在以上模拟的代码中加上一个判断(出列的人是否位于n+1~2n之间,那么k就可以暴力搜索出来。
代码如下:
#include < iostream>
#include < cstring>
const int MAXN=1000;
int a[MAXN];
using namespace std;
void init(int n){
memset(a,0,sizeof(a));
for(int i=1;i<=2*n;i++)
a[i]=i;
}
void post_emulate(int n){
int i,number,j,k,temp;
for(k=n+1;;k++){
init(n);//对于每次k(一个完整的模拟过程)都要初始化
number=n*2;//总人数
i=0;
while(number!=n){
i=((i+k)%number==0)?number:(i+k)%number;
temp=a[i];
for(j=i+1;j<=number;j++)
a[j-1]=a[j];
if(temp>=n+1&&temp<=2*n){
i–;number–;
}else break;
}
if(number==n){
cout<< k << endl;
break;
}else continue;
}
}
int main(){
int n;
cin>>n;
post_emulate(n);
return 0;
}

猜你喜欢

转载自blog.csdn.net/zyf2695421695/article/details/77877357