概述
代码参考这篇文章
题目来自于58同城:
总共m个人围成一圈,编号从1开始。从第一个人开始传一朵花,当传递到第n个人时,此人出局,此人下一个人开始重新技术,直到所有人都出局,请按照原始的编号给出出局顺序。
例如:
顺序为[1,2,3,4,5,6,7],m=7,每次传递到n=6时出局,出局顺序为[6,5,7,2,1,4,3]。
#include <bits/stdc++.h>
using namespace std;
class Person{
public:
int index;
int num;
Person(int i,int n):index(i),num(n){};
};
int main(){
deque<Person> Circle;
int m,n;
cout<<"请输人数m,出局编号n"<<endl;
cin>>m>>n;
for(int i=0;i<m;i++) {//初始化队列
int index = i+1;
Person peo(index,n-1);
Circle.push_back(peo);
}
int i=0;
while(!Circle.empty()){
int num = Circle[i].num;
if(i + num >= Circle.size())
i = (i + num) % Circle.size();
else i = i + num;
cout<<Circle[i].index<<" ";
Circle.erase(Circle.begin() + i);
}
cout<<endl;
return 0;
}
只使用数组
只使用数组麻烦一点,使用size–模拟手动删除元素后数组大小减1(实际大小没有变),删除元素后,删除元素后面的元素整体前移。result_index用来保存出来的数字,出一个,存进数组,索引+1。
#include <bits/stdc++.h>
using namespace std;
int *IsContinue(int m,int n)
{
int *result = new int[m];
int result_index = 0;//存储结果的索引,存一个索引加1
int person[m];//每个index对应一个数值
for(int i=0;i<m;i++)
person[i] = i+1;
int i=0;
int size = m;//数组大小无法改变,使用size模拟删除元素后数组大小减1
while(size > 0){
if(i + n >= size)
i = (i + n-1) % size;
else i = i + n-1;
result[result_index++] = person[i];
for(int j=i+1;j<size;j++)
{
person[j-1] = person[j];
}
size--;
}
return result;
}
int main(){
int m,n;
cout<<"请输人数m,出局编号n"<<endl;
cin>>m>>n;
int *r = IsContinue(m,n);
for(int i=0;i<m;i++)
cout<<r[i]<<" ";
delete r;
return 0;
}
最后
以上就是失眠皮卡丘为你收集整理的击鼓传花游戏的全部内容,希望文章能够帮你解决击鼓传花游戏所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复