算法 — 地大復試
模擬
while循環和MOD循環計數
1.約瑟夫問題
http://bailian.openjudge.cn/practice/3254
using namespace std;bool isNoPeople(vector<bool> c)//判斷當前數組是否一個小孩都沒有了
{bool nopeople = true;for (bool ival : c){if ( ival == true)nopeople = false;}return nopeople;
}int main()
{int n, p, m;//n人數, p游戲起點(對于idx為p-1), m為傳遞次數cin >> n >> p >> m;vector<bool> c(n, true);//其實用數組同樣效果沒必要非得用vector. int i = p-1;//模擬的起點idxwhile (!isNoPeople(c))//💡控制條件不是指定次數而是一種狀態時就不再使用for來寫,while會更清晰和可操作性高{int t = m;//每輪更新剔除小孩的傳遞次數while (t > 0)//只要t>0就一直傳遞{while (c[i] == false)//當小孩沒有在座位上(小孩已經剔除)?執行向下傳遞直到傳遞到小孩存在的位置退出循環i = (i + 1) % n;--t;//下標為i位置的小孩傳出if (t == 0)//如果傳出時次數為0(暴雷了){cout << i + 1 << ',';//idx為i的小孩對應為第i+1個小孩剔除(打印輸出)c[i] = false;//小孩座位標記剔除標記為falsebreak;//本輪剔除小孩結束進行下一輪直到一個小孩都沒有}i = (i + 1) % n;//沒有暴雷,就傳給下一個小孩}}
}