Josephus問題解決方法一

Diy_os發表於2015-10-20
關於該問題簡單描述:假設有n個人排成一個圈。從第一個人開始報數,數到第m個人的時候這個人從佇列裡出列。然後繼續在環裡數後面第m個人,讓其出列直到所有人都出列。最後一個出列的是勝出者。下面用連結串列模擬n個同學手拉手圍成一個圈。如果m為1的話,該遊戲沒有了意思,因為這樣的話,第n個人一定是勝出者,所以排除這種情況。解決該問題,有很多方法,本方法用的是迴圈單連結串列。如有不當之處,請讀者指正!

點選(此處)摺疊或開啟

  1. #include<iostream>
  2. //#include<stdlib.h>
  3. using namespace std;

  4. struct Note {

  5.     int data;
  6.     struct Note *next;

  7. };

  8. Note *CreateNote() {

  9.     Note *first;
  10.     first = new Note; //first = (Note *)malloc(sizeof(Note))
  11.     first ->data  = NULL;  //建立頭結點,並且不存放任何值
  12.     return first;
  13. }

  14. Note *InitNote(Note *first, int n) {

  15.     Note *head, *p;
  16.     head = first;

  17.     p = NULL;

  18.     cout << "同學開始座次:" << endl;

  19.     for (int i = 1; i <= n; i++) { //利用尾插法,構造連結串列

  20.         p = new Note;
  21.         head->next = p;
  22.         p->data = i;
  23.         cout << p->data << "--> ";
  24.         head = p;
  25.     }

  26.     p->next = first->next;  //形成換
  27.     return first;     //返回頭結點
  28. }

  29. void Search(Note *q, int m) {  

  30.     cout << "依次出列同學:";
  31.     if (m == 1) {      //如何查詢間隔為1,則終止程式

  32.         cout << "遊戲太無聊!";
  33.         exit(-1);
  34.     }

  35.     for (int i = 1; q != q->next; q = q->next, i++) {

  36.         if (i == m) {   //當i = m時,執行其中的語句,並初始化i = 1,至於原因,讀者畫圖便可知

  37.             i = 1;
  38.             Note *n;
  39.             n = q->next;
  40.             cout << q->next->data << "--> ";
  41.             q->next = n->next;
  42.             delete n;

  43.         }
  44.     }

  45.     cout << q->data;
  46.     cout << endl;
  47.     cout << "獲勝的是:" << q->data << "號同學" << endl;

  48. }
  49. int main() {

  50.     Note *p, *q;
  51.     p = CreateNote();
  52.     q = InitNote(p, 5);
  53.     cout << endl;
  54.     Search(q, 2);
  55. }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1815055/,如需轉載,請註明出處,否則將追究法律責任。

相關文章