約瑟夫環C++實現很經典的做法
阿新 • • 發佈:2019-01-26
原文地址:http://www.cnblogs.com/hanxi/archive/2012/10/10/2718413.html
/*
**********************迴圈連結串列解決約瑟夫環問題***********************
* 問題:約瑟夫環
* 有編號從1到N的N個人坐成一圈報數,從第K個人開始報數,報到M的人出局,
* 下一位再從1開始報數,如此持續,直止剩下一位為止,報告此人的編號X。
* 輸入N,K,M,求出X。
********************************************************************* */ #include <iostream> using namespace std; struct MyNode { MyNode(int a_data):m_data(a_data),m_pNext(NULL) {} int m_data; MyNode *m_pNext; }; class Josephus { public: Josephus(int a_N, int a_K, int a_M):m_N(a_N),m_K(a_K),m_M(a_M) { createList(); outputList(); } protected: void createList(); void outputList(); private: MyNode *m_pHead;//迴圈連結串列的頭節點 int m_N; //連結串列節點個數 int m_K; //第一個報數人的序號 int m_M; //報數出局的數 }; void Josephus::createList() { MyNode *pre = NULL; MyNode *cur = NULL; MyNode *p = new MyNode(1); m_pHead = p; cur = p; for (int i=2; i<=m_N; i++) { p = new MyNode(i); pre = cur; cur = p; pre->m_pNext = cur; } cur->m_pNext = m_pHead; int n=m_N; p = m_pHead; while (n--) { cout << p->m_data << ","; p = p->m_pNext; } cout << endl; } void Josephus::outputList() { MyNode *pre = NULL; MyNode *cur = m_pHead; m_K; while (m_K--) //尋找第K個人(開始報數的人) { pre = cur; cur = cur->m_pNext; } while (m_N--) //輸出連結串列中所有的節點值 { int s = m_M-1; while (s--) //尋找間隔M的人 { pre = cur; cur = cur->m_pNext; } MyNode *p = cur; cout << p->m_data << ","; cur = cur->m_pNext; //刪除節點的過程 pre->m_pNext = cur; delete p; p=NULL; } } int main() { Josephus josephus(100,5,5); return 0; }