一、問題的提出
n個人圍成一圈,從1到n編上號,開始報數:凡是報到m的淘汰出局。若是你,你選擇幾號,將被最終留下。
二、設計方案
這是乙個迴圈報數問題,故要找乙個能迴圈數數的資料結構來解決。
方案一:
單迴圈鍊錶解決。建立乙個n個結點的單迴圈鍊錶,其值域分別為1到n 。從第乙個結點開始報數,凡是報到m的,其值域置為0且n減1。下次數到值域為0的結點時,將其隔過去,數下乙個結點,當數到m時,將該結點的值域置為0且n減1,依次進行下去,直到n為1。輸出值域不為0的結點的值域,就是我們要選擇的編號。
方案二:
雙迴圈鍊錶解決。建立乙個n個結點的雙迴圈鍊錶,其值域分別為1到n 。從第乙個結點開始報數,凡是報到m的,將該結點刪除,繼續報數,報到m的,將該結點刪除,這樣進行下去,直到鍊錶中只剩乙個結點。輸出第乙個結點的值域,就是我們要選擇的編號。
方案三:
一維陣列解決。定義乙個長度為n的一維陣列,元素值分別為1到n,即a[0]=1,a[1]=2,a[2]=3......a[n-1]=n。下標從t=0開始,尋找出列元素的下標為t+m-1,為保證迴圈報數,取模:(t+m-1)%當前圈中人數。然後將其從陣列中刪除。當陣列中剩下乙個元素時,迴圈結束,輸出該元素的值,就是我們要選擇的編號。
方案四:
佇列解決。建立乙個具有n個結點的佇列的鏈式結構。報數時,凡是報1--m-1的做出隊、入隊操作,而報m的只做出隊操作,這樣依次進行下去,當佇列中只剩下乙個元素時,迴圈結束,輸出該元素的值,就是我們要選擇的編號。
三、流程(實現舉例)
方案一:
n=4,m=3,count=0,p指向第乙個結點
如果*p結點的值域為0或*p結點是head結點,p後移,直到*p結點的值域不為0且不是head結點。
count++; 判斷count是否m的倍數,若是,將*p結點的值域置為0。p後移
count為3,是m的倍數,將*p結點的值域置為0,p後移。 重複上述操作。
*p是head結點,p後移,直到*p不是head結點且值域不為0。
此時count為4。
count為6,是m的倍數,將*p結點的值域置為0,p後移。
重複上述操作
count為9,是m的倍數,將*p結點的值域置為0,p後移。
此時,值不為0的結點只有乙個,迴圈結束,輸出該結點的值域。
方案二:
建立雙迴圈鍊錶,p指向第乙個結點,count初值為0。
如果*p結點是head結點,p後移。
否則,count++。判斷count是否為m的倍數,若是,刪除該結點;若不是,p後移。
count為3,是m的倍數,刪除該結點。
刪除方法:q=p; p=q->next; p->prior=q->prior; q->prior->next=p; free(q);
*p不是head結點,count++,p後移。
*p是head結點,p只後移,不計數,count仍為4。
count為6,是m的倍數,刪除該結點。
重複上述操作步驟。
count為9,是m的倍數,刪除該結點。
此時只剩下乙個結點,迴圈結束。輸出第乙個結點的值域。
方案三:
陣列初始化,元素值分別為1、2、3、4。n表示當前元素個數,初值為4。
開始尋找要出列的元素的下標t,t的初值為0。
因為m的倍數出列,故出列元素的下標為(t+m-1)%n。
所以第一次淘汰的t=(t+m-1)%n=(0+3-1)%3=2。
刪除下標為t的元素,元素個數減1。n=n-1=3。
方案四:
建立乙個鏈隊,從頭到尾結點的值域分別為1、2、3、4
t的初值為1,當t
隊首元素出隊
t的初值為1,當t
Eclipse修改專案名稱
修改使用中專案的名稱 1.修改專案目錄下 project檔案中name為目標專案名 gzelearning 2.專案右鍵屬性 web project settings context root 3.修改專案目錄下 settings org.eclipse.wst.common.component 4...
TFS修改專案名稱
如何讓tfs管理的專案更名後不丟失修改歷史記錄?在工作中有時由於前期考慮不足,某個project的名字在專案開發過程中需要修改以更準備表達它的功能。本文就對此進行拋磚引玉 在sourcecontrol中對所要修改的專案所在目錄進行更名 移除當前要更名的專案 因為在sourcecontrol中改名後,...
Spring框架 專案名稱起源
我總是經常問,spring這個名字到底是從何而來.名字要從2002年十一月說起了,我發表了一本書叫.書裡附帶了30000行的框架的 全年幾乎我都把時間用在了寫這本書上 完全靠自己寫750頁的書和開發一 和template,jdbc template以及資料訪問異常組成的.我不確定我能為 做什麼,我很...