約瑟夫環鏈表解決演算法

2021-07-11 04:59:00 字數 1142 閱讀 3158

1.起源

據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第k個人。接著,再越過k-1個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

2.鍊錶實現

通過鍊錶實現約瑟夫環比較容易理解

定義資料結構

#include #include #include typedef struct node

node;

建立鍊錶

假設這裡我們建立有41個人的鍊錶

node* createlist(int num)                       //傳遞引數生成多少個節點

ptemp->next=head; //鍊錶的尾巴連線煉表頭,形成乙個迴圈鍊錶

return head;

}

實際呼叫

int main()

pdelete=p->next; //需要刪除的節點為移動節點的下一節點

printf("約瑟夫環出環順序:%d\n",pdelete->num);

p->next=pdelete->next; //鍊錶重新連線,去除刪除節點

p=pdelete->next; //鍊錶指標重新移動;

free(pdelete); //刪除需要出列的節點

} printf("約瑟夫環出環順序:%d\n",p->num);//最後乙個出列的鍊錶

free(p);

return 0;

}

雙鏈表解決約瑟夫環

前幾天去佳龍面試 有一道演算法題 用雙鏈表解決約瑟夫環問題 當時是和兩個朋友一塊去的 他們看完題直接走了 其實我是不想走的 但是從眾心理太強 我也走了 後天周一 我要再去一趟 其實我當時也不知道什麼是約瑟夫環 就走了 而且面試的人態度很不好 這裡是實現 class doublenode class ...

HashMap與衝突解決演算法

hash map是經常被使用的一種資料結構,而其實現方式也是多種多樣。如果要求我們使用盡可能簡單的方式實現hash map,具體該如何做呢?我們知道hash map最重要兩個概念是hash函式和衝突解決演算法。hash map鍵 值之間的對映關係,hash函式將鍵對映為記憶體位址,衝突解決演算法用於...

分治思想解決演算法問題

不多bb,o n 2 include using namespace std void solve int f 5000 int m cin m for int i 0 i m i cin a i f 0 0 for int i 1 i m i f i f i 1 sum cout f m 1 en...