避免使用指针: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 来代替数组,并以索引的方式访问元素。

  1. 首先,我们创建一个大小为n的 vector,并将每个元素初始化为其索引。2. 然后,我们使用一个循环来模拟约瑟夫环的过程。在每次迭代中,我们找到要删除的元素的索引,并将其标记为-1。3. 最后,我们遍历 vector 并找到唯一一个未被标记为-1的元素,即为最后剩下的元素。

总结

通过使用 vector 和索引,我们可以避免使用指针来解决约瑟夫环问题。这种方法更加简洁易懂,也更不容易出错。


原文地址: https://www.cveoy.top/t/topic/Rin 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录