先說一下什麼是約瑟夫環問題,這是百科的解釋:
約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知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 輸入兩個...