避免使用指针:C++约瑟夫环问题的替代解决方案
避免使用指针:C++约瑟夫环问题的替代解决方案
有些情况下,我们希望避免在C++中使用指针,例如为了提高代码的可读性或降低出错的可能性。本文将介绍如何不使用指针解决经典的约瑟夫环问题。
问题描述
约瑟夫环问题是一个经典的算法问题:n个人围成一圈,从第k个人开始报数,报到第m个人时,该人出局,然后从出局的下一个人开始重新报数,如此循环,直到最后只剩下一个人。要求输出最后剩下的人的编号。
代码实现(不使用指针)cpp#include #include
using namespace std;
int main(){ int n = 0, k = 0, m = 0; cin >> n >> k >> m;
vector<int> circle(n); for (int i = 0; i < n; i++) { circle[i] = i; }
int idx = k - 1; while (n > 1) { int count = 0; while (count < m) { if (circle[idx] >= 0) { count++; } idx = (idx + 1) % n; } circle[(idx - 1 + n) % n] = -1; n--; }
for (int i = 0; i < n; i++) { if (circle[i] >= 0) { cout << circle[i] << endl; break; } }
return 0;}
代码解释
在这个版本中,我们使用 vector 来代替数组,并以索引的方式访问元素。
- 首先,我们创建一个大小为n的
vector,并将每个元素初始化为其索引。2. 然后,我们使用一个循环来模拟约瑟夫环的过程。在每次迭代中,我们找到要删除的元素的索引,并将其标记为-1。3. 最后,我们遍历vector并找到唯一一个未被标记为-1的元素,即为最后剩下的元素。
总结
通过使用 vector 和索引,我们可以避免使用指针来解决约瑟夫环问题。这种方法更加简洁易懂,也更不容易出错。
原文地址: https://www.cveoy.top/t/topic/Rin 著作权归作者所有。请勿转载和采集!