報數問題(約瑟夫環)

2021-06-17 22:08:03 字數 1190 閱讀 8753

解法一:用陣列模擬

#include

using

namespace

std;

intmain()

sign--;//

實際標號的

if(sign<0

) sign=n-1;

if(i==n-1

) cout

loop[sign]=0

; } }

return0;

}

解法二:

//從位置考慮,舉例說:

nnum:5 move:212

3453

4515

1335

33在最後一次的pos1位置是0;

倒推,它的位置pos2為(

0+2)%2=0

;繼續,它的位置pos3為(

0+2)%3=2

;pos4=(pos3+2)%4=0

;pos5=(pos4+2)%5=2

;因為實際生活中編號總是從1開始,所以輸出加一。

# include

intmain()

//也可遞迴:

令f[i]表示i個人報m退出最後勝利者的編號,那最後的結果是f[n].

遞推公式:

f[1]=0

;f[i]=(f[i-1]+m)%i; (i>1)

解法三:

//剛看了看鍊錶,就用鍊錶模擬一下

# include# include

# define l

sizeof(struct

node)

typedef

struct

node

seqlist;

seqlist *head,*tail;

void create(int n)//

建立鍊錶

tail->next=p;

tail=p;

}tail->next=head;

}void deletlist(int m)//

查詢報m的人,並刪除該節點

else p=q;

}while(p!=p->next);

head=p;

}int

main()

}return0;

}

約瑟夫環問題(報數問題)

先說一下什麼是約瑟夫環問題,這是百科的解釋 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。思路 因為n...

報數遊戲(約瑟夫環問題)

題目描述 有n個小朋友做遊戲,他們的編號分別是1,2,3 n。他們按照編號從小到大依次順時針圍成乙個圓圈,第乙個小朋友從1開始報數,依次按照順時針方向報數 報數的值加一 每個報m的人會離開隊伍,然後下乙個小朋友會繼續從1開始報數,直到只剩下乙個小朋友為止。求最後一位小朋友的編號。input 輸入兩個...

約瑟夫環問題 圓桌報數問題

約瑟夫環問題 一圈共有n個人,開始報數,報到m的人自殺,然後重新開始報數,問最後自殺的人是誰?如圖 內環表示人排列的環,外環表示自殺順序 上面n 41,m 3。最普通辦法就是模擬整個過程 建乙個bool陣列,true表示此人還活著,false表示已經自殺。可以模擬整個過程 cpp view plai...