亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

詳解約瑟夫環問題及其相關的C語言算法實現

2020-01-26 14:58:44
字體:
來源:轉載
供稿:網友

約瑟夫環問題

N個人圍成一圈順序編號,從1號開始按1、2、3......順序報數,報p者退出圈外,其余的人再從1、2、3開始報數,報p的人再退出圈外,以此類推。  
請按退出順序輸出每個退出人的原序號 


算法思想
用數學歸納法遞推。

無論是用鏈表實現還是用數組實現都有一個共同點:要模擬整個游戲過程,不僅程序寫起來比較煩,而且時間復雜度高達O(nm),若nm非常大,無法在短時間內計算出結果。我們注意到原問題僅僅是要求出最后的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規,實施一點數學策略。

為了討論方便,先把問題稍微改變一下,并不影響原意:
問題描述:n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數。求勝利者的編號。

我們知道第一個人(編號一定是m%n-1) 出列之后,剩下的n-1個人組成了一個新的約瑟夫環(以編號為k=m%n的人開始):
k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2并且從k開始報0。
現在我們把他們的編號做一下轉換:

k     --> 0
k+1   --> 1
k+2   --> 2
...
...
k-2   --> n-2
k-1   --> n-1
變換后就完完全全成為了(n-1)個人報數的子問題,假如我們知道這個子問題的解:例如x是最終的勝利者,那么根據上面這個表把這個x變回去不剛好就是n個人情況的解嗎?!!變回去的公式很簡單,相信大家都可以推出來:x'=(x+k)%n

如何知道(n-1)個人報數的問題的解?對,只要知道(n-2)個人的解就行了。(n-2)個人的解呢?當然是先求(n-3)的情況――這顯然就是一個倒推問題!好了,思路出來了,下面寫遞推公式:

令f[i]表示i個人玩游戲報m退出最后勝利者的編號,最后的結果自然是f[n]

遞推公式
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)

實現方法


一、循環鏈表
建立一個有N個元素的循環鏈表,然后從鏈表頭開始遍歷并計數,如果基數i == m,則踢出該元素,繼續循環,直到當前元素與下一個元素相同時退出循環

    

#include <stdio.h>   #include <stdlib.h>   #include <string.h>       typedef struct lnode   {     int pos;     struct lnode *next;   } lnode;           /**    * 構建循環鏈表&&循環遍歷    */   void create_ring(lnode **root, int loc, int n)   {     lnode *pre, *current, *new;     current = *root;     pre = NULL;         while (current != NULL) {       pre = current;       current = current->next;     }         new = (lnode *)malloc(sizeof(lnode));     new->pos = loc;     new->next = current;         if (pre == NULL) {       *root = new;     } else {       pre->next = new;     }         // 循環鏈表     if (loc == n) {       new->next = *root;     }   }       /**    * 約瑟夫環    */   void kickoff_ring(lnode *head, int p)   {     int i;     lnode *pre, *pcur;     pre = pcur = head;         while (pcur->next != pcur) {       for (i = 1; i < p; i ++) {         pre = pcur;         pcur = pcur->next;       }           printf("%d ", pcur->pos);       pre->next = pcur->next;       free(pcur);       pcur = pre->next;     }     printf("%d/n", pcur->pos);     free(pcur);   }           void print_ring(lnode *head)   {     lnode *cur;      cur = head;         while (cur->next != head) {       printf("%d ", cur->pos);       cur = cur->next;     }     printf("%d/n", cur->pos);   }       int main()   {     int i, p, n;     lnode *head;         while (scanf("%d %d", &n, &p) != EOF) {       // 構建循環鏈表       for (i = 1, head = NULL; i <= n; i ++)         create_ring(&head, i, n);           // 約瑟夫環       if (p != 1)          kickoff_ring(head, p);       else         print_ring(head);     }         return 0;   } 

    /**************************************************************
        Problem: 1188
        User: wangzhengyi
        Language: C
        Result: Accepted
        Time:110 ms
        Memory:912 kb
    ****************************************************************/ 

二、數組模擬
思想跟循環鏈表類似,少了構建循環鏈表的過程

   

 #include <stdio.h>   #include <stdlib.h>      int main()   {     int i, index, p, n, remain, delete[3001], flag[3001] = {0};        while (scanf("%d %d", &n, &p) != EOF) {       remain = n;       index = 0;       while (remain >= 1) {         for (i = 0; i < n; i ++) {           if (flag[i] == 0) {             // 報數             index ++;             // 報p者退出圈外             if (index == p) {               // 退出圈外               flag[i] = 1;               // 重新報數               index = 0;               delete[remain - 1] = i + 1;               remain --;             }             }           }       }          // 輸出每個退出人的序號       for (i = n - 1; i >= 0; i --) {         if (i == 0) {           printf("%d/n", delete[i]);         } else {           printf("%d ", delete[i]);         }       }     }        return 0;   } 

    三、數學推導
       

#include <stdio.h>      int main(void)   {     int i, n, m, last;        while (scanf("%d", &n) != EOF && n != 0) {       // 接收報數       scanf("%d", &m);          // 約瑟夫環問題       for (i = 2, last = 0; i <= n; i ++) {         last = (last + m) % i;       }       printf("%d/n", last + 1);     }        return 0;   } 

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜未满十八勿入免费观看全集| 欧美一级电影免费在线观看| 精品久久久免费| 亚洲va久久久噜噜噜久久天堂| 国产成人激情视频| 中文字幕一区日韩电影| 这里只有精品视频在线| 在线激情影院一区| 精品国产一区二区在线| 17婷婷久久www| 国内外成人免费激情在线视频| 亚洲成人国产精品| 亚洲一区二区三区视频| 亚洲精品720p| 欧美夫妻性生活视频| 亚洲男人av电影| 欧美最猛黑人xxxx黑人猛叫黄| 日韩欧美在线视频日韩欧美在线视频| 日本精品久久中文字幕佐佐木| 欧美日韩国产中文字幕| 欧美一区二区三区四区在线| 日本免费久久高清视频| 黑人巨大精品欧美一区二区一视频| 亚洲男子天堂网| 日韩精品中文字幕在线观看| 亚洲精品电影网在线观看| 欧洲中文字幕国产精品| 欧美一区二区影院| 日韩国产欧美区| 国产精品极品美女粉嫩高清在线| 国产成人91久久精品| 国产精品久久久久影院日本| 51精品国产黑色丝袜高跟鞋| 亚洲精品影视在线观看| 精品久久久久久久久久国产| 亚洲自拍高清视频网站| 日韩欧美一区视频| 亚洲国产高清高潮精品美女| 欧美人成在线视频| 欧亚精品中文字幕| 亚洲性69xxxbbb| 久久国产精品免费视频| 久久久久北条麻妃免费看| 欧美日韩999| 久久亚洲私人国产精品va| 国产精品青青在线观看爽香蕉| 欧美日韩综合视频网址| 91久久嫩草影院一区二区| 欧美激情视频在线| 日韩激情av在线免费观看| 亚洲国产高清高潮精品美女| 中文字幕在线看视频国产欧美| 成人a在线视频| 欧洲亚洲女同hd| 在线成人中文字幕| 久久香蕉国产线看观看av| 久久久久久久一区二区| 九九热这里只有在线精品视| 一夜七次郎国产精品亚洲| 日本欧美国产在线| 亚洲精品日韩欧美| 欧美在线激情视频| 久久久久久香蕉网| 性视频1819p久久| 日本三级韩国三级久久| 国产在线观看91精品一区| 亚洲天堂av高清| 亚洲国产日韩欧美综合久久| 日韩av在线免费播放| 在线观看亚洲视频| 日韩毛片在线看| 亚洲人在线观看| 国产一区二区三区在线观看视频| 久久免费视频网| 欧美精品www在线观看| 午夜剧场成人观在线视频免费观看| 日韩欧美国产中文字幕| 日本午夜在线亚洲.国产| 欧美多人爱爱视频网站| 91精品在线国产| 91精品国产电影| 97视频在线观看免费高清完整版在线观看| 亚洲最新中文字幕| 97视频在线观看播放| 成人av在线亚洲| 久久精品99久久久久久久久| 欧美精品精品精品精品免费| 一区二区亚洲精品国产| 亚洲精品v天堂中文字幕| 久久99国产精品久久久久久久久| 69国产精品成人在线播放| 国产xxx69麻豆国语对白| 欧美国产极速在线| 亚洲色图15p| www.欧美视频| 亚洲男人天天操| 欧美性xxxxx极品娇小| 成人中文字幕+乱码+中文字幕| 成人日韩在线电影| 欧美大肥婆大肥bbbbb| 欧美日韩亚洲国产一区| 奇米四色中文综合久久| 91精品国产91久久久久| 69国产精品成人在线播放| 国产精品欧美日韩久久| 久久亚洲国产精品成人av秋霞| 亚洲国产日韩欧美在线动漫| 国产精品亚洲综合天堂夜夜| 欧美高清视频免费观看| 欧美在线视频在线播放完整版免费观看| 欧美与黑人午夜性猛交久久久| 欧美精品久久久久久久| 精品av在线播放| 久久91亚洲精品中文字幕| 国产区精品视频| 国产一区二区三区视频免费| 日韩激情视频在线| 色偷偷偷综合中文字幕;dd| 一区二区三区日韩在线| 国产精品美乳一区二区免费| 欧美精品在线免费观看| 欧美大胆在线视频| 奇米影视亚洲狠狠色| 日本一区二区三区在线播放| 7m第一福利500精品视频| 在线看日韩欧美| 久久99热精品| 亚洲区在线播放| 国产美女高潮久久白浆| 国产精品专区一| 国产97在线视频| 亚洲女在线观看| 中文字幕亚洲图片| 热久久免费国产视频| 国产成人啪精品视频免费网| 国产日韩欧美自拍| 国产美女久久精品| 久久97精品久久久久久久不卡| 久久久久久综合网天天| 欧美日韩国产中文字幕| 在线精品视频视频中文字幕| 亚洲欧美日韩第一区| 久久综合免费视频影院| 国产精品美女呻吟| 精品国产一区二区三区久久狼黑人| 欧美人交a欧美精品| 欧美成人午夜免费视在线看片| 欧美在线日韩在线| 国产精品扒开腿爽爽爽视频| 中文字幕av一区中文字幕天堂| 91国内揄拍国内精品对白| 色天天综合狠狠色| 久久久久久国产精品美女| 在线观看成人黄色| 精品亚洲一区二区三区| 91成品人片a无限观看| 欧美日韩一区二区在线| 亚洲曰本av电影| 国内成人精品一区| 日韩视频亚洲视频| 久久久久久国产精品三级玉女聊斋| 精品国产91乱高清在线观看| 亚州成人av在线| 久久男人的天堂|