有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号。
//其实是约瑟夫环问题 方法一: 用数组来模拟圈 第一次开始数的位置的索引为0 删除数的索引为(startPos+(m-1)%length)%length 更新开始数数位置的索引 数组删除元素要用移位
//方法二,用list循环链表模拟圈 第一次从 List.begin() 开始数,每次数m个 更新开始数数的位置。数到List.end() 时要回到初始迭代器List.begin()
#include<iostream>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<list>
#include<algorithm>
using namespace std;
//其实是约瑟夫环问题 方法一: 用数组来模拟圈 第一次开始数的位置的索引为0 删除数的索引为(startPos+(m-1)%length)%length 更新开始数数位置的索引 数组删除元素要用移位
//方法二,用list循环链表模拟圈 第一次从 List.begin() 开始数,每次数m个 更新开始数数的位置。数到List.end() 时要回到初始位置
int LastRemaining(int a[],int n)
{
if(a==NULL||n<1)
{
return -1;
}
const int m=3;//数到第三个人出列
int k=0;
for(int i=1;i<=n;i++)
{
a[k++]=i;
}
int startPos=0;//第一次开始数的位置的索引为0
int indexToBeDeleted;
int length=n;
while(length>1)
{
indexToBeDeleted=(startPos+(m-1)%length)%length;//被删除元素的索引
startPos=indexToBeDeleted;
for(int j=indexToBeDeleted;j+1<=length-1;j++)//用移位来删除元素
{
a[j]=a[j+1];
}
length--;//每次数组长度减去一
}
return a[0];
}
int LastRemaining2(int a[],int n)//用循环链表做
{
list<int> List;
for(int i=1;i<=n;i++)
{
List.push_back(i);
}
list<int>::iterator iter=List.begin();
while(List.size()!=1)
{
for(int i=0;i<3-1;i++)
{
iter++;
if(iter==List.end())
{
iter=List.begin();
}
}
list<int>::iterator iterToBeDelete=iter;
if(++iter==List.end())//下一个数数的的位置
{
iter=List.begin();
}
List.erase(iterToBeDelete);
}
return *iter;
}
int main()
{
int n;
while(cin>>n)
{
int a[10000];
cout<< LastRemaining(a,n)<<endl;
}
return 0;
}
还有一种最简单最笨的办法就是也是用数组每次一个一个的数,被删除的元素设立标志位置为0,数到末尾时返回第一个元素开始数
<pre name="code" class="cpp">#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<string>
using namespace std;
int LastRemaining3(int a[],int n)
{
for(int i=0;i<n;i++)
{
a[i]=i+1;
}
const int m=3;//数到3的那个人出列
int length=n;
int startPos=0;//一开始数数的位置
while(n>1)//跳出循环时只数组中只剩下最后一个元素
{
int count=0;//计数数的个数
while(1)
{
if(a[startPos]!=0)
{
count++;
if(count==m)//数到m跳出循环跳出的元素的索引刚好为删除元素的索引
{
break;
}
}
startPos++;
if(startPos==length)当数到末尾时返回索引0
{
startPos=0;
}
}
cout<<"delete the element "<<a[startPos]<<endl;
a[startPos]=0;//被删除的元素填充为0
n--;
}
for(int i=0;i<length;i++)
{
if(a[i]!=0)
{
//cout<<"the last one is "<<a[i]<<endl;
return i+1;
}
}
}
int main()
{
int a[100];
int n;
cout<<"please input n"<<endl;
cin>>n;
cout<<"the last one is "<<LastRemaining3(a, n)<<endl;
return 0;
}