(看到xdoj上题的题解很少,就想着把自己过了的题都写一下吧。。。如有不对之处,敬请指出)
约瑟夫环问题,很经典的一道题,比如数据结构上机题中有要求使用循环链表解决这个问题,当然链表敲起来太长太麻烦了,事实上,只需要使用数组模拟就行啦。
大致是模拟一个如下过程:对于含有n个数字的数列需要进行n次删除操作,每次删除一个数。对于某次删除的数来说,下一次要删除的数是它“后面”(因为排成圆圈)未删除的数的第k个,即将指针从某次被删除的数向“后”移动k次就到了下次被删除的数了。
AC代码如下:
#include
#include
using namespace std;
int n,k;
bool a[1010];
int main(){
scanf("%d %d",&n,&k);
int num=n,point=0;
for(int i=1;i<=n;i++)
a[i]=1;
while(num){//num代表当前还有多少个数字没有删除
int step=k;//step即k,模拟每次指针移动一个的步骤,当移动了k个之后,将指针所指的数字删除
for(;step>0;){
if(point
某天无聊时,想着用更简单的方法写一个,然后用双端队列写了一遍,事实上想法还是一样的,模拟出删除和指针移动的过程,好处是不用考虑下标,更无脑,但是没比数组模拟快。。。
AC代码如下:
#include
#include
#include
using namespace std;
deque
dq;
int main(){
int n,k,num,step;
cin>>n>>k;
for(int i=1;i<=n;i++){
dq.push_back(i);
}
while(n--){
step=k;
for(;step>1;step--){
num=dq.front();
dq.pop_front();
dq.push_back(num);
}
num=dq.front();
dq.pop_front();
printf("%d",num);
if(n!=0)
printf(" ");
}
return 0;
}