30 個人在一條船上,超載,需要 15 人下船。用環形鍊錶去構造資料結構於是人們排成一隊,排隊的位置即為他們的編號。
報數,從 1 開始,數到 9 的人下船。
如此迴圈,直到船上僅剩 15 人為止,問都有哪些編號的人下船了呢?
每逢9的倍數,將該鍊錶刪除,指標指向下乙個數字
# 首先構造環形鍊錶,這個很基本不多說
# 刪除鍊錶操作
while remain_people !=15:
for ii in
range(1
,8):
# 前7次運動是沒有任何問題的
ptr = ptr.
next
else
:# 第8次運動,需要跳過第9個數,並將其刪除
# 列印9號鍊錶
print
(ptr,
'{}號下船了'
.format
(ptr.
next
.name)
)# 刪除9號鍊錶(同時跳過這個數)
ptr.
next
= ptr.
next
.next
remain_people -=
1# 指標向前運動一次
ptr = ptr.
next
'''
30 個人在一條船上,超載,需要 15 人下船。
於是人們排成一隊,排隊的位置即為他們的編號。
報數,從 1 開始,數到 9 的人下船。
如此迴圈,直到船上僅剩 15 人為止,問都有哪些編號的人下船了呢?
思路:用環形鍊錶去做
'''# 1 定義乙個類
class
people
:def
__init__
(self)
: self.name =
' ' self.
next
=none
# 初始化第乙個鍊錶
head = people(
)head.name =
'1'ptr = head
# 2, 對30個人進行初始化,用字串進行初始化
for ii in
range(2
,31):
new_people = people(
) new_people.name =
str(ii)
ptr.
next
= new_people
ptr = ptr.
next
# 形成環形鍊錶
ptr.
next
= head
# 測試環形鍊錶,測試通過
debug =
0if debug:
ptr = head
while
true
:print
(ptr,ptr.name)
ptr = ptr.
next
if ptr == head:
break
else
:pass
else
:pass
# 3, 開始遍歷,用while remain_people !=15 來判斷
# 巢狀1個迴圈,用for迴圈,每逢9,刪除乙個鍊錶,並列印出來
remain_people =
30ptr = head
while remain_people !=15:
for ii in
range(1
,8):
ptr = ptr.
next
else
:# 列印9號鍊錶
print
(ptr,
'{}號下船了'
.format
(ptr.
next
.name)
)# 刪除9號鍊錶
ptr.
next
= ptr.
next
.next
remain_people -=
1# 指標向前運動一次
ptr = ptr.
next
執行效果
<__main__.people object at 0x01a00ab0
>
9號下船了
<__main__.people object at 0x01a00cf0
>
18號下船了
<__main__.people object at 0x01a00f30
>
27號下船了
<__main__.people object at 0x01a009f0
>
6號下船了
<__main__.people object at 0x01a00c70
>
16號下船了
<__main__.people object at 0x01a00ef0
>
26號下船了
<__main__.people object at 0x01a009f0
>
7號下船了
<__main__.people object at 0x01a00cf0
>
19號下船了
<__main__.people object at 0x01a00ff0
>
30號下船了
<__main__.people object at 0x01a00b70
>
12號下船了
<__main__.people object at 0x01a00e70
>
24號下船了
<__main__.people object at 0x01a009f0
>
8號下船了
<__main__.people object at 0x01a00df0
>
22號下船了
<__main__.people object at 0x01a009b0
>
5號下船了
<__main__.people object at 0x01a00df0
>
23號下船了
process finished with exit code 0
這個**是一次性寫成功的,沒有出任何bug,說明非常高效,思考了一下原因如下:
在寫**之前,一定要在草稿紙上畫一遍,觀察資料特點,以及資料變化過程,然後再設計資料結構和演算法。
進入編譯器,把題目抄上去注釋用三引號注釋,接著開始寫**思路123,具體功能,怎麼迴圈,怎麼判斷等等,然後用#注釋掉
接著在注釋掉的地方開始寫**框架,如迴圈,判斷框架。寫好之後再去完善變數,定義。
寫到一半的時候,就要寫乙個測試**,用if debug
來控制是否啟用,便於提前找出問題,並加深理解程式。
約瑟夫生死者小遊戲
30 個人在一條船上,超載,需要 15 人下船。於是人們排成一隊,排隊的位置即為他們的編號。報數,從 1 開始,數到 9 的人下船。如此迴圈,直到船上僅剩 15 人為止,問都有哪些編號的人下船了呢?people list range 30 while len people 15 i 1 while ...
小遊戲 約瑟夫
現在有m個凳子排成乙個圈,我們順時針給凳子依次編號為1,2,3 m。我們從編號為s的凳子開始,每次先順時針數n個凳子,將第n個凳子搬走,然後再逆時針數k個凳子,將第k個凳子搬走。每次都這樣先順時針數n個,再逆時針數k個,直到只剩1個凳子,直接搬走。最後,我們想知道m個凳子的搬走順序。共4行,每行1個...
Python 約瑟夫生者死者小遊戲
問題描述 30 個人在一條船上,超載,需要 15 人下船。於是人們排成一隊,排隊的位置即為他們的編號。報數,從 1 開始,數到 9 的人下船。如此迴圈,直到船上僅剩 15 人為止,問都有哪些編號的人下船了呢?解決思路 給30個人編號1 30,每個人的初值都是1 在船上 i代表他們的編號,j代表被扔下...