解法一:用陣列模擬#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...