joseph problem(35分)
題目內容:
實作joseph problem.
假設一開始有n個人,編號1~n,
按照順序以順時針圍成乙個圓圈。
遊戲開始時,編號1的人拿刀。
之後每一輪刀子會被往下傳m個人,
而當輪最後拿到刀子的人會將他的下乙個人殺掉,
殺完後刀子會再傳給被殺的下乙個人。
這樣一輪就算結束。
遊戲會進行許多輪,直到只剩下最後乙個人。
範例1:n=5, m=2
第一輪:刀子傳給3號,4號被殺,刀子再傳給5號 (1 2 3 5)
第二輪:刀子傳給2號,3號被殺,刀子再傳給5號 (1 2 5)
第三輪:刀子傳給2號,5號被殺,刀子再傳給1號 (1 2)
第四輪:刀子傳給1號,2號被殺,最後1號存活。
範例2:n=4, m=3
第一輪:刀子傳給4號,1號被殺,刀子再傳給2號 (2 3 4)
第二輪:刀子傳給2號,3號被殺,刀子再傳給4號 (2 4)
第三輪:刀子傳給2號,4號被殺,最後2號存活。
輸入格式:
輸入第一行為乙個數字t,代表測資的筆數。
接下來會有t筆測資,每一筆測資一行,
會有兩個數字n,m,數字間以空格區隔。
數字範圍:
t < 1000
0 < n <= 1000
0 < m <= 1000
輸出格式:
輸出一行數字,將每筆測資最後存活下來的人的編號加總。
輸入樣例:
5 24 3
8 4輸出樣例:
#include #include #define error null
typedef int elementtype;
typedef struct lnode *ptrtolnode;
struct lnode ;
typedef ptrtolnode position;
typedef ptrtolnode list;
position find(list l, elementtype x);
list insert(list l, elementtype x, position p);
list delete(list l, position p);
int main()
ptrtolnode p, q, temp;
p = l;
while (p->next)
p->next = l;
q = l;
while (q->next != q)
temp = q->next;
q->next = temp->next;
free(temp);
q = q->next;
} ans += q->data;
//printf("%d\n", q->data);
} printf("%d\n", ans);
}list insert(list l, elementtype x, position p)
current = l;
while (current&¤t->next != p)
if (current == null)
p->data = x;
p->next = current->next;
current->next = p;
return l;
}position find(list l, elementtype x)
return error;
}list delete(list l, position p)
while (p&&p->next != p)
if (p == null) // 如果找不到要刪除的節點
temp = p->next;
p->next = temp->next;
free(temp);
return l;
}
迴圈鍊錶解決約瑟夫 問題
據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所...
迴圈鍊錶解決約瑟夫迴圈問題
最近開始複習資料結構,今天手寫了乙個約瑟夫迴圈問題。首尾相連的鍊錶 head last tail tail next head 建立迴圈鍊錶和建立普通鍊錶方法差不多,只需要首尾相連即可 已知 n 個人 以編號1,2,3,n分別表示 圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那...
C迴圈鍊錶解決約瑟夫斯問題
問題描述 設有n個人圍坐成乙個圓圈,按一定指向方向,從第s個人開始報數,數到m的人出列,然後從下乙個人重新報數,數到m的人又出列,直到n個人全部出列為止。輸入 n m s,按次序輸出得到的n個人的順序表。include using namespace std typedef int datetype...