約瑟夫環 OJ

2021-08-29 00:27:02 字數 1003 閱讀 9215

迴圈鍊錶的應用,並且應為不帶頭節點的迴圈鍊錶,首先建立乙個迴圈鍊錶,在函式johephus中進行操作,主要就是用for找到要刪除的元素(注意p==1單獨考慮,for中p至少為2),刪除元素並輸出直至鍊錶為空。

for(j=1;j<=p-1;j++)把尋找報數的位置和尋找要刪除的節點的前驅結合在乙個迴圈中,減少時間複雜度,因為第一次寫我是在主函式中用r指向找到的要刪除的節點,然後傳入delete(&l,r)中刪除,而在delete中,需要從頭找r的前驅,再修改指標,會發現這其中兩個尋找的過程是重複進行的,所以基於函式功能的思想將它結合在一起,放入johephus中,

第一次寫加入了initlist,但由於沒有頭節點,只是將頭指標賦為空指標,並沒有意義,而呼叫函式會使時間增長,可以將這一步放入到creat函式中,判空函式也完全可以有while(cur.next!=cur)來表示,當然這個函式判斷是否只剩乙個元素了,也完全不用重新寫delete,

#include

#include

#define error -1

typedef struct lnodelnode,* link;

void creat_list(link *l,int n)}}

void johephus(link *l,int n,int p)

printf("%d",(*cur).num);

}else//p>=2

printf("%d ",(*cur).num);

(*r).next=(*cur).next;

free(cur);

cur=(*r).next;

}//while

printf("%d",(*cur).num);

}//else

}//johephus

int main()

//if

}//if

return 0;

}

九度OJ 題目1189 還是約瑟夫環

題目1189 還是約瑟夫環 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 341 解決 204 題目描述 生成乙個長度為21的陣列,依次存入1到21 建立乙個長度為21的單向鍊錶,將上述陣列中的數字依次存入鍊錶每個結點中 將上述鍊錶變為單向封閉 迴圈 鍊錶 從頭結點開始數,將第17個結...

OJ 約瑟夫環問題(迴圈鍊錶解法)

有n人圍成一圈,順序排號。從第1個人開始報數 從1到3報數 凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。輸入初始人數n 輸出最後一人的初始編號 樣例輸入 3樣例輸出 2故事背景 據說著名猶太歷史學家 josephus 有過以下的故事 在羅馬人占領喬塔帕特後,39個猶太人與josephus...

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...