国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

約瑟夫經典問題擴展成雙向約瑟夫問題

2020-01-26 13:30:59
字體:
來源:轉載
供稿:網友

約瑟夫問題是一個經典的問題,我們不妨將這個經典問題進行擴展,變成一個雙向的約瑟夫問題。

已知 n 個人(不妨分別以編號 1,2,3,...,n 代表 )圍坐在一張圓桌周圍,首先從編號為 k 的人從 1 開始順時針報數,1, 2, 3, ...,記下順時針數到 m 的那個人,同時從編號為 k 的人開始逆時針報數,1, 2, 3, ...,數到 m 后,兩個人同時出列。然后從出列的下一個人又從 1 開始繼續進行雙向報數,數到 m 的那兩個人同時出列,...;。依此重復下去,直到圓桌周圍的人全部出列。直到圓桌周圍只剩一個人為止。

如果雙向報數報到 m 時落在同一個人身上,那本次出列的只有一個人。

例如:5,1,2。則總共5個人,從1開始順時針報數,數到2,定位編號2;同時從1開始報數數到2,定位編號5;2和5同時出列。然后繼續開始報數,順時針報數3,4,定位到4;逆時針報數4,3,定位3;4和3同時出列。最后剩余的為編號1。輸出為:2-5,4-3,1,。

如果輸入:6,2,3。則輸出:4-6,2,1-3,5,。其中第2次只輸出一個2,表示第二次雙向報數時,恰好都落在編號2上,所以只有一個編號出列。

輸入:

n,k,m

輸出:

按照出列的順序依次輸出編號。同時出列編號中間用減號"-”連接。

非法輸入的對應輸出如下

a)

  • 輸入:n、k、m任一個為0
  • 輸出:n,m,k must bigger than 0.

b)

  • 輸入:k>n
  • 輸出:k should not bigger than n.

測試輸入

1,0,0
1,2,1
5,1,2

測試輸出

n,m,k must bigger than 0.
k should not bigger than n.
2-5,4-3,1,

源代碼

#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int ElemType; int n,m,k; //定義一個全局變量  typedef struct DuLNode    //雙向循環鏈表結構 {   ElemType data;   struct DuLNode *prior;   struct DuLNode *next; }DuLNode,*DuLinkList;   void Create(DuLinkList &H)  //創建帶頭結點的雙向循環鏈表  {   DuLinkList p,q;   int i;   H=(DuLinkList)malloc(sizeof(DuLNode));    p=H;   q=H;   for(i=1;i<=n;i++)   {     p=(DuLinkList)malloc(sizeof(DuLNode));     p->data=i;     p->prior=q;     q->next=p;     q=p;   }   p->next=H;   H->prior=p; } void Delete(DuLinkList &P) //刪除結點  {   P->prior->next=P->next;   P->next->prior=P->prior; } int main() {   int i;   DuLinkList H,l,R,right,left; //分別用以表示頭結點,l和R都用于找k的值,向右(順時針),向左(逆時針)    scanf("%d,%d,%d",&n,&k,&m);      if(!n||!k||!m)     {       printf("n,m,k must bigger than 0./n");       return 0;       }     if(k>n)     {       printf("k should not bigger than n./n");       return 0;     }         Create(H);     R=H->next ;     while(R->data!=k)     {       R=R->next;     }     l=R;     while(n)     {       right=R;       left=l;       for(i=1;i<m;i++)       {         right=right->next;         left=left->prior;         //遇見頭結點需要特殊處理         if(right==H)           right=right->next;         if(left==H)           left=left->prior;       }       R=right->next;       l=left->prior;       if(R==H)         R=R->next;       if(l==H)         l=l->prior;       if(right!=left)       {         n=n-2;         printf("%d-%d,",right->data,left->data);         Delete(right);         Delete(left);       }       else       {         n=n-1;         printf("%d,",right->data);         Delete(right);        }     }     printf("/n");  } 

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。如果你想了解更多相關內容請查看下面相關鏈接

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 大埔县| 井冈山市| 布尔津县| 方城县| 元阳县| 常熟市| 星座| 淄博市| 毕节市| 瓦房店市| 唐河县| 宁乡县| 汝阳县| 南康市| 苍溪县| 万安县| 浦江县| 丰原市| 南漳县| 洛川县| 巫溪县| 通辽市| 峡江县| 唐河县| 澄迈县| 分宜县| 新乐市| 怀柔区| 新源县| 曲靖市| 陆川县| 兴文县| 南皮县| 萨嘎县| 喀喇| 长乐市| 星子县| 洪湖市| 巴青县| 彭山县| 高邮市|