python約瑟夫生死小遊戲的實現

2021-09-26 14:02:36 字數 3581 閱讀 7452

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代表被扔下...