当前位置:   article > 正文

信息学奥赛一本通T2037约瑟夫问题(动态链表)_一本通2037

一本通2037

咳咳咳

好久没写CSDN了

本蒟蒻写的这些东西应该没人看吧(确信)

好了好了,进入正题(传送锚点->题目

本题思路十分简单:

1.传统数组法(我们此处只讲动态链表的思路)

当然,如过你是比我还弱的蒟蒟蒻请去看其他各路大神的数组题解

那就直接放上数组的AC代码了

欸,我这不是写动态链表方法的吗?

2.动态链表

首先,建立一个动态链表

如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. int num;
  5. node *pre;
  6. node *next;
  7. };//建立链表结构体
  8. int main()
  9. {
  10. int n,m;
  11. cin>>n>>m;
  12. node *head=NULL;
  13. node *tail=NULL;
  14. //表头表尾(其实表尾并无卵用)
  15. node *temp=NULL;
  16. //记录上一个节点
  17. for(int i=1;i<=n;i++)
  18. {
  19. node *t=new node;//建立一个动态链表节点
  20. if(head==NULL){//记录表头
  21. head=t;
  22. }
  23. t->num=i;//记录号码
  24. t->pre=temp;//前驱
  25. t->next=NULL;//后继
  26. if(temp!=NULL){//如果前一个不是空的
  27. temp->next=t;//将前一个的后继指向当前节点
  28. }
  29. temp=t;//将前一个指向当前节点
  30. if(i==n){
  31. tail=t;
  32. head->pre=tail;
  33. tail->next=head;
  34. }//链接表头表尾
  35. }

 然后是叫号踢人(doge) 

  1. int ns=n;//剩余人数
  2. int pt=0;//目前叫号
  3. node *p=head;//拿一个指针方便遍历
  4. while(ns!=0){//人数不等于0
  5. pt++;//叫号
  6. if(pt==m)//号数符合
  7. {
  8. p->pre->next=p->next;
  9. p->next->pre=p->pre;
  10. //断链(踢人)
  11. pt=0;//重置号数
  12. ns--;//人数减一
  13. cout<<(p->num)<<" ";//输出序号
  14. }
  15. p=p->next;//移动遍历指针
  16. }
  17. return 0;
  18. }

有耐心看到最后的好人们,就能拿到……

《无注释全代码》

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. int num;
  5. node *pre;
  6. node *next;
  7. };
  8. int main()
  9. {
  10. int n,m;
  11. cin>>n>>m;
  12. node *head=NULL;
  13. node *tail=NULL;
  14. node *temp=NULL;
  15. for(int i=1;i<=n;i++)
  16. {
  17. node *t=new node;
  18. if(head==NULL){
  19. head=t;
  20. }
  21. t->num=i;
  22. t->pre=temp;
  23. t->next=NULL;
  24. if(temp!=NULL){
  25. temp->next=t;
  26. }
  27. temp=t;
  28. if(i==n){
  29. tail=t;
  30. head->pre=tail;
  31. tail->next=head;
  32. }
  33. }
  34. int ns=n;
  35. int pt=0;
  36. node *p=head;
  37. while(ns!=0){
  38. pt++;
  39. if(pt==m)
  40. {
  41. p->pre->next=p->next;
  42. p->next->pre=p->pre;
  43. pt=0;
  44. ns--;
  45. cout<<(p->num)<<" ";
  46. }
  47. p=p->next;
  48. }
  49. return 0;
  50. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/670251
推荐阅读
相关标签
  

闽ICP备14008679号