生活随笔
收集整理的這篇文章主要介紹了
简单约瑟夫环问题解法汇总(模拟/数论)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.求解最后一個
N個人坐成一個圓環(編號為1 - N),從第1個人開始報數,數到K的人出列,后面的人重新從1開始報數。問最后剩下的人的編號。
例如:N = 3,K = 2。2號先出列,然后是1號,最后剩下的是3號。
輸入
2個數N和K,表示N個人,數到K出列。(2 <= N, K <= 10^6)
輸出
最后剩下的人的編號
輸入樣例
3 2
輸出樣例
3
#include <bits/stdc++.h>
using namespace std
;
int Joseph(int n
,int m
)
{int ans
= 0;for(int i
= 2; i
<= n
; i
++){ans
= (ans
+ m
) % i
;}return ans
+1;
}
int main()
{int n
,m
;cin
>>n
>>m
;cout
<<Joseph(n
,m
)<<endl
;return 0;
}
#include <bits/stdc++.h>
using namespace std
;
int Joseph(int n
,int m
)
{if(n
== 2){if(m
&1)return 2;elsereturn 1;}elsereturn (Joseph(n
-1,m
)-1 + m
) % n
+ 1;
}
int main()
{int n
,m
;cin
>>n
>>m
;cout
<<Joseph(n
,m
);return 0;
}
2.求解每一個
題目背景
約瑟夫是一個無聊的人!!!
題目描述
n個人(n<=100)圍成一圈,從第一個人開始報數,數到m的人出列,再由下一個人重新從1開始報數,數到m的人再出圈,……依次類推,直到所有的人都出圈,請輸出依次出圈人的編號.
輸入格式
n m
輸出格式
出圈的編號
輸入輸出樣例
輸入 #1 復制
10 3
輸出 #1 復制
3 6 9 2 7 1 8 5 10 4
說明/提示
m,n≤100
#include <bits/stdc++.h>
using namespace std
;
vector
<int>v
;
int main()
{int n
,m
;cin
>>n
>>m
;for(int i
= 1; i
<= n
; i
++)v
.push_back(i
);int x
= 0;for(int i
= 0; i
< n
; i
++){x
= (x
+ m
- 1) % v
.size();cout
<<v
[x
]<<" ";v
.erase(v
.begin()+x
);}return 0;
}
#include <bits/stdc++.h>
using namespace std
;
int main()
{queue
<int>q
;int n
,m
;cin
>>n
>>m
;if(!n
||!m
) return 0;for(int i
= 1; i
<= n
; i
++){q
.push(i
);}int cnt
= 0;while(q
.size()>1){int x
= q
.front();cnt
++;q
.pop();if(cnt
% m
== 0){cout
<<x
<<" ";continue;}q
.push(x
);}cout
<<q
.front()<<endl
;q
.pop();return 0;
}
#include <bits/stdc++.h>
using namespace std
;
typedef struct Node
{int num
;struct Node
*nxt
;
}node
;
node
* createNode(int x
)
{node
*p
;p
= new node
;p
->num
= x
;p
->nxt
= NULL;return p
;
}
node
* createJoseph(int n
)
{node
*p
,*head
,*q
;for(int i
= 1; i
<= n
; i
++){p
= createNode(i
);if(i
== 1)head
= p
;elseq
->nxt
= p
;q
= p
;}q
->nxt
= head
;return head
;
}
void runJoseph(int n
,int m
)
{node
*p
= createJoseph(n
);node
*q
= NULL;while(p
->nxt
!= p
){for(int i
= 1; i
< m
-1; i
++){p
= p
->nxt
;}q
= p
->nxt
;cout
<<(q
->num
)<<" ";p
->nxt
= q
->nxt
;p
= p
->nxt
;delete q
;}cout
<<(p
->num
)<<endl
;
}
int main()
{int n
,m
;cin
>>n
>>m
;if(n
&&m
)runJoseph(n
,m
);return 0;
}
#include <iostream>using namespace std
;
bool vis
[105];
int main()
{int n
,m
;cin
>>n
>>m
;int cnt
= 0,num
= 0;while(cnt
<n
){for(int i
= 1; i
<= n
; i
++){if(vis
[i
]) continue;num
++;if(num
% m
== 0){vis
[i
] = true
;if(cnt
!= n
)cout
<<i
<<" ";else cout
<<i
<<endl
;cnt
++;if(cnt
== n
) break;}}}return 0;
}
#include <bits/stdc++.h>
using namespace std
;
int nxt
[105];
int main()
{int n
,m
;cin
>>n
>>m
;for(int i
= 1; i
<= n
; i
++)nxt
[i
] = i
+1;nxt
[n
] = 1;for(int i
= n
,j
= 1; n
;i
= nxt
[i
],j
++){if(j
% m
== 0){cout
<<nxt
[i
]<<" ";nxt
[i
] = nxt
[nxt
[i
]];n
--;}}return 0;
}
總結
以上是生活随笔為你收集整理的简单约瑟夫环问题解法汇总(模拟/数论)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。