xdoj 1008 Josephus环

来源:互联网 发布:网络玄幻小说大纲模板 编辑:程序博客网 时间:2024/06/02 03:48

(看到xdoj上题的题解很少,就想着把自己过了的题都写一下吧。。。如有不对之处,敬请指出)

约瑟夫环问题,很经典的一道题,比如数据结构上机题中有要求使用循环链表解决这个问题,当然链表敲起来太长太麻烦了,事实上,只需要使用数组模拟就行啦。

大致是模拟一个如下过程:对于含有n个数字的数列需要进行n次删除操作,每次删除一个数。对于某次删除的数来说,下一次要删除的数是它“后面”(因为排成圆圈)未删除的数的第k个,即将指针从某次被删除的数向“后”移动k次就到了下次被删除的数了。

AC代码如下:

#include#includeusing 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#includeusing 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;}