約瑟夫環問題(報數問題)

2021-06-28 09:27:29 字數 2250 閱讀 7772

先說一下什麼是約瑟夫環問題,這是百科的解釋:

約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。

思路:因為n個人不定,所以採用鍊錶。因為是連續報數的,所以是用迴圈鍊錶。每數到m,那個m號的人就刪除掉,然後從他身後一位重新開始,再數到m,再刪除,一直這樣。怎麼樣才能停止呢?就是當一開始的隊伍沒人的時候。就是一開始按順序建立乙個有順序的鍊錶1~n,再根據m刪除,刪除掉的人又重新組成乙個鍊錶,這就是出局的順序。怎麼根據m來刪除呢?當從1號開始數,經過m-1個人就是要刪除的那位。就是2,3,...m-1。再從m-1的後一位開始當作1,再經過m-1個人這樣重複。

下面我給出我寫的**:

/* 關於我寫的函式說明一下

* head,root變數分別代表一開始按順序的隊伍和出局順序的隊伍

* 插入函式中因為兩個表的形成方式不同所以插入方式有所不同

* 銷毀函式也是一樣

* 約瑟夫問題的解決主要體現是在刪除函式上

*/#include #include typedef struct node

node;

/* 初始化鍊錶 */

int initlist(node **head, int n);

/* 新增至鍊錶,要做成迴圈鍊錶 */

int insertlist(node *head, int n, int flag); /* flag代表不同插入方式 */

/* 刪除 */

int deletelist(node *head, node *root, int m);

/* 輸出鍊錶 */

int displaylist(node *head);

/* 銷毀鍊錶 */

int destroylist(node *head, int flag); /* 代表不同銷毀方式 */

/* 轉置函式 */

int transpose(node *head);

int main(void)

/* 初始化鍊錶 */

int initlist(node **head, int n)

/* 新增至鍊錶,要做成迴圈鍊錶 */

int insertlist(node *head, int n, int flag)

else

rear->next = null;

} rear->next = head->next; /* 形成迴圈鍊錶 */

} /* 這是root的插入方式,頭插法,可以不用迴圈鍊錶,因為遊戲已經結束 */

else

else

}return 1;

}/* 刪除 */

int deletelist(node *head, node *root, int m)

previous = current;

current = current->next;

i++;

}previous->next = current->next; /* 刪除元素 */

insertlist(root, current->num, flag); /* 將刪除出來的元素新增至新的鍊錶中 */

free(current);

count--; /* 每free一次就減少乙個人 */

current = previous->next; /* 從被刪掉元素的後一位重新開始 */

} return 1;

}/* 輸出鍊錶 */

int displaylist(node *head)

current = current->next;

i++;

} return 1;

}/* 銷毀鍊錶 */

int destroylist(node *head, int flag)

return 1;

}/* 轉置函式 */

int transpose(node *head)

head->next->next = null;

head->next = p1;

return 1;

}

現在給出程式執行的結果:

因為是新手,所以不懂得怎麼優化**,請多多包含。

報數問題(約瑟夫環)

解法一 用陣列模擬 include using namespace std intmain sign 實際標號的 if sign 0 sign n 1 if i n 1 cout loop sign 0 return0 解法二 從位置考慮,舉例說 nnum 5 move 212 3453 4515 ...

約瑟夫環問題 圓桌報數問題

約瑟夫環問題 一圈共有n個人,開始報數,報到m的人自殺,然後重新開始報數,問最後自殺的人是誰?如圖 內環表示人排列的環,外環表示自殺順序 上面n 41,m 3。最普通辦法就是模擬整個過程 建乙個bool陣列,true表示此人還活著,false表示已經自殺。可以模擬整個過程 cpp view plai...

報數遊戲(約瑟夫環問題)

題目描述 有n個小朋友做遊戲,他們的編號分別是1,2,3 n。他們按照編號從小到大依次順時針圍成乙個圓圈,第乙個小朋友從1開始報數,依次按照順時針方向報數 報數的值加一 每個報m的人會離開隊伍,然後下乙個小朋友會繼續從1開始報數,直到只剩下乙個小朋友為止。求最後一位小朋友的編號。input 輸入兩個...