1.1.1分析論證:有m個敢死隊員要炸掉敵人的一碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如果此戰士沒完成任務,再從下乙個戰士開始數數,被數到第5時,此戰士接著去執行任務。以此類推,直到任務完成為止。
1.1.2目的意義:(1)排長是不願意去的,假設排長為1號,我需要設計一程式,求出從第幾號戰士開始計數才能讓排長最後乙個留下來而不去執行任務。
(2)同時我需要採用兩種不同的資料結構實現。
1.1.3達到目標:(1)設定好乙個迴圈單鏈表。(2)選出合適m的倍數,列出,並刪除節點。人數減一。(3)用free(p)用完之後就銷毀,避免記憶體空間浪費
1.2、 資料結構和演算法說明
1.2.1總體設計與分析和設計:利用逆向思維:
題目中要求排長為1號,問從哪號開始計數可以使得排長最後乙個活下來
我們是不是可以這樣認為,不妨設從1號開始計數,看看最後倖存的是幾號,
再倒推回來就是應該從哪號數數,最後讓排長倖存。
1.2.2採用的資料結構:迴圈單鏈表和另一種動態規劃 。
1.2.3演算法思想:
我是以迴圈單鏈表的方法來求解這道題的。最後給出一種更好的改進的方法(動態規劃)。我先在紙上推導出滿足的公式s = (s + k) % i,這是編號從0開始的,現題目要求編號從一開始,所以結果需加一。因此建立了aplus函式來求出其倖存號碼。後最後在main函式實現,然後就可求出最終符合條件倖存號碼。
1.2.4遇到的問題:遍歷迴圈單鏈表時,頭尾指標的next設定錯了,導致不能構成乙個圓圈去遍歷它。還有一點是利用動態規劃演算法中
在動態規劃演算法中,
1.2.5解決方法:設定好頭指標的next指向空,同時把data的值賦給i,把尾指標tail賦給p。p賦值回尾指標tail。
1.3、全部源程式清單
**清單及主要注釋:
原始檔下的main.cpp如下:
第一種方法:
#include
#include
#include
using
namespace std;
//const int mod = 1000;
struct node
;int
main()
tail-
>next = head-
>next;
// ans我設定為從1號開始報數
int ans =1;
q = head;
p = head-
>next;
//只考慮n>1的情況 ,因為n如果小於等於1就不用選了
while
(n !=1)
else
//乙個人報完數就接著下乙個人
ans++;}
cout <
<
"倖存的是:"
<
< endl;
cout <
< p-
>data <
<
"號"<
< endl;
cout <
<
"因此應在從1號開始數數的基礎上倒退"
<
< endl;
cout <
< p-
>data -
1<
<
"位"<
< endl;
cout <
<
"開始數數,可保證 排長最後乙個留下"
<
< endl;
cout <
<
"任意鍵關閉"
; cin.
get();
cin.
get();
}第二種方法:
#include
using
namespace std;
intaplus
(int n,
int k)
intmain()
cout <
<
"倖存的是:"
<
< endl;
cout <
< gg <
<
"號"<
< endl;
cout <
<
"因此應在從1號開始數數的基礎上倒退"
<
< endl;
cout <
< gg -
1<
<
"位"<
< endl;
cout <
<
"開始數數,可保證 排長最後乙個留下"
<
< endl;
cout <
<
"按任意鍵結束"
; cin.
get();
cin.
get();
}
1.4、程式執行、測試與分析
1.4.1執行結果:
敢死隊問題
有m個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如果此戰士沒完成任務,再從...
不敢死隊問題
不敢死隊問題 timelimit 1000ms memory limit 65536k 題目描述 說到 敢死隊 大家不要以為我來介紹電影了,因為資料結構裡真有這麼道程式設計題目,原題如下 有m 個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰...
不敢死隊問題
time limit 1000ms memory limit 65536k 有疑問?點這裡 有m個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數...