约瑟夫问题:n个骑士编号1,2,...,n,围坐在圆桌旁。编号为1的骑士从1开始报数,报到m的骑士出列,然后下一个位置再从1开始报数,找出最后留在圆桌旁的骑士编号。 (1)编写一个函数模板。以一种顺序容器的类型作为模板参数,在模板中使用指定类型的顺序容器求解约瑟夫问题。m,n是该函数模板的形参。 (2)分别以vector<int>,deque<int>,list<int>作为类型参数调用该函数模板,调用时将n设为较大的数,将m设为较小的数(例如令n=100000,n=5)。观察3种情况下调用该函数模板所需花费的时间。 注:本题答案的提交只需选择一种顺序容器类型作为模板参数。 【输入形式】 程序参考的输入(数字前为提示文字): Input n and m:7 3 【输出形式】 程序参考的输出: Result:4 【样例输入】 Input n and m:7 3 【样例输出】 Result:4 【样例说明】 【评分标准】 #include<iostream> #include<vector> using namespace std; int main() { vector<int> a; int n,m,x=0; cout<<"Input n and m:"; cin>>n>>m; a.resize(n); for(int i=0;i<n;i++) { a[i]=i+1; } cout<<"Result:"<<a[0]<<endl; return 0; }
时间: 2024-01-31 15:01:46 浏览: 98
好的,根据你给出的参考代码,我稍作修改,使用vector作为模板参数,实现了一个函数模板来解决约瑟夫问题:
```c++
#include <vector>
#include <iostream>
template<typename Container>
typename Container::iterator josephus_permutation(Container& c, typename Container::iterator iter, int step)
{
while (c.size() > 1) {
for (int i = 1; i < step; ++i) {
if (++iter == c.end()) {
iter = c.begin();
}
}
iter = c.erase(iter);
if (iter == c.end()) {
iter = c.begin();
}
}
return iter;
}
int main()
{
int n, m;
std::cout << "Input n and m:";
std::cin >> n >> m;
std::vector<int> vec(n);
for (int i = 0; i < n; ++i) {
vec[i] = i + 1;
}
auto iter = vec.begin();
iter = josephus_permutation(vec, iter, m);
std::cout << "Result: " << *iter << std::endl;
return 0;
}
```
你可以根据需要修改n和m的值,然后编译并运行程序,得到程序的输出结果。
不过需要注意的是,由于本题要求使用较大的n值(例如100000),因此在使用vector作为容器类型时,需要先调用resize函数来为vector分配足够的内存空间,否则程序可能会因为内存不足而崩溃。
阅读全文