瑟夫問(wèn)題k個(gè)好人k個(gè)壞人問(wèn)題 求約瑟夫問(wèn)題思路
*問(wèn)題分析與算法設(shè)計(jì)
約瑟夫問(wèn)題并不難,但求解的方法很多;題目的變化形式也很多。這里給出一種實(shí)現(xiàn)方法。
題目中30個(gè)人圍成一圈,因而啟發(fā)我們用一個(gè)循環(huán)的鏈來(lái)表示。可以使用結(jié)構(gòu)數(shù)組來(lái)構(gòu)成一個(gè)循環(huán)鏈。結(jié)構(gòu)中有兩個(gè)成員,其一為指向下一個(gè)人的指針,以構(gòu)成環(huán)形的鏈;其二為該 人是否被扔下海的標(biāo)記,為1表示還在船上。從第一個(gè)人開(kāi)始對(duì)還未扔下海的人進(jìn)行計(jì)數(shù),每數(shù)到9時(shí),將結(jié)構(gòu)中的標(biāo)記改為0,表示該人已被扔下海了。這樣循環(huán)計(jì)數(shù)直到有15個(gè)人被扔下海為止。
*程序說(shuō)明與注釋
#include<stdio.h>
struct node
{
int nextp; /*指向下一個(gè)人的指針(下一個(gè)人的數(shù)組下標(biāo))*/
int no_out; /*是否被扔下海的標(biāo)記。1:沒(méi)有被扔下海。0:已被扔下海*/
}link[31]; /*30個(gè)人,0號(hào)元素沒(méi)有使用*/
int main()
{
int i,j,k;
printf("The original circle is(+:pagendom,@:christian):\n");
for(i=1;i<=30;i++) /*初始化結(jié)構(gòu)數(shù)組*/
{
link[i].nextp=i+1; /*指針指向下一個(gè)人(數(shù)組元素下標(biāo))*/
link[i].no_out=1; /*標(biāo)志置為1,表示人都在船上*/
}
link[30].nextp=1; /*第30個(gè)人的指針指向第一個(gè)人以構(gòu)成環(huán)*/
j=30; /*j:指向已經(jīng)處理完畢的數(shù)組元素,從link[i]指向的人開(kāi)始計(jì)數(shù)*/
for(i=0;i<15;i++) /*i:已扔下海的人數(shù)計(jì)數(shù)器*/
{
for(k=0;;) /*k:決定哪個(gè)人被扔下海的計(jì)數(shù)器*/
if(k<15)
{
j=link[j].nextp; /*修改指針,取下一個(gè)人*/
k+=link[j].no_out; /*進(jìn)行計(jì)數(shù)。因已扔下海的人計(jì)標(biāo)記為0*/
}
else break; /*計(jì)數(shù)到15則停止計(jì)數(shù)*/
link[j].no_out=0; /*將標(biāo)記置 0,表示該人已被扔下海*/
}
for(i=1;i<=30;i++) /*輸出結(jié)果*/
printf("%c",link[i].no_out? '@':'+'); /*+:被扔下海, @:在船上*/
printf("\n");
}
這個(gè)程序你可以參考,具體他做的是30個(gè)人,好人壞人各一半
隨便寫了一下,原理是不停的試,直到找為止
#include "stdio.h"
#include "stdlib.h"
main()
{long b,j,i,n,temp,out=0,sum;
printf("\n請(qǐng)輸入人數(shù):\n");
scanf("%ld",&n);
int a[2*n+1];//構(gòu)造一個(gè)表;
int flag=0;b=n;//flag是標(biāo)志,為0,還沒(méi)有找到,1是找到。
while (flag!=1)
{temp=n;sum=0;b++;out=0;
for(j=0;j<=2*n;j++)//初如化表;
a[j]=1;
for(i=1;out<=temp;i++)//找最小的輸出項(xiàng)
{ if(i==2*n+1)
i=1;
if(a[i]==1)
sum++;
if(sum==b)
{a[i]=0; sum=0;out++;
printf("第%2d個(gè)數(shù)下,輸出第個(gè)%d是:%d\n",b,out ,i);
if(i<=n) break;}
if(out==temp)
{flag=1;break;}
}printf("\n");
}
printf("最小的結(jié)果是:%d",b);
system("pause");
}
好麻煩啊
什么是約瑟夫問(wèn)題
假設(shè)在圈子里的前K個(gè)人是好人,后K個(gè)人是壞人,你的任務(wù)是找出最小的M值,以確保所有壞人在第一個(gè)好人之前被淘汰。
瑟夫問(wèn)題k個(gè)好人k個(gè)壞人問(wèn)題
這是17世紀(jì)的法國(guó)數(shù)學(xué)家加斯帕在《數(shù)目的游戲問(wèn)題》中講的一個(gè)故事:15個(gè)教徒和15 個(gè)非教徒在深海上遇險(xiǎn),必須將一半的人投入海中,其余的人才能幸免于難,于是想了一個(gè)辦法:30個(gè)人圍成一圓圈,從第一個(gè)人開(kāi)始依次報(bào)數(shù),每數(shù)到第九個(gè)人就將他扔入大海,如此循環(huán)進(jìn)行直到僅余15個(gè)人為止。問(wèn)怎樣排法...
什么是約瑟夫問(wèn)題
約瑟夫問(wèn)題是個(gè)有名的問(wèn)題:N個(gè)人圍成一圈,從第一個(gè)開(kāi)始報(bào)數(shù),第M個(gè)將被殺掉,最后剩下一個(gè),其余人都將被殺掉。例如N=6,M=5,被殺掉的人的序號(hào)為5,4,6,2,3。最后剩下1號(hào)。假定在圈子里前K個(gè)為好人,后K個(gè)為壞人,你的任務(wù)是確定這樣的最少M(fèi),使得所有的壞人在第一個(gè)好人之前被...
約瑟夫問(wèn)題
約瑟夫問(wèn)題是個(gè)有名的問(wèn)題:N個(gè)人圍成一圈,從第一個(gè)開(kāi)始報(bào)數(shù),第M個(gè)將被殺掉,最后剩下一個(gè),其余人都將被殺掉。例如N=6,M=5,被殺掉的人的序號(hào)為5,4,6,2,3。最后剩下1號(hào)。 假定在圈子里前K個(gè)為好人,后K個(gè)為壞人,你的任務(wù)是確定這樣的最少M(fèi),使得所有的壞人在第一個(gè)好人之前被殺掉。 C++代碼示例:...
學(xué)C語(yǔ)言的NOIP問(wèn)題
現(xiàn)在的問(wèn)題是:假設(shè)有k個(gè)好人和k個(gè)壞人。好人的編號(hào)的1到k,壞人的編號(hào)是k+1到2k。我們希望求出m的最小值,使得最先出列的k個(gè)人都是壞人。 輸入: 僅有的一個(gè)數(shù)字是k(0 < k <14)。 輸出: 使得最先出列的k個(gè)人都是壞人的m的最小值。 輸入樣例: 4 輸出樣例: 30 程序: #include <stdio.h> long k...
嘉興市第十屆全國(guó)青少年信息學(xué)奧林匹克聯(lián)賽初賽試題
現(xiàn)在的問(wèn)題是:假設(shè)有k個(gè)好人和k個(gè)壞人。好人的編號(hào)是1到k,壞人的編號(hào)是k+1到2k。我們希望求出m的最小值,使得最先出列的k個(gè)人都是壞人。 輸入: 僅有的一個(gè)數(shù)字是k (0<K<14)。 輸出: 使得最先出列的k個(gè)人都是壞人的m的最小值。 輸入樣例: 4 輸出樣例: 30 程序: program progaram1; var i,k,...
初中微機(jī)試題誰(shuí)有
現(xiàn)在的問(wèn)題是:假設(shè)有k個(gè)好人和k個(gè)壞人。好人的編號(hào)的1到k,壞人的編號(hào)是k+1到2k。我們希望求出m的最小值,使得最先出列的k個(gè)人都是壞人。 輸入: 僅有的一個(gè)數(shù)字是k(0 < k <14)。 輸出: 使得最先出列的k個(gè)人都是壞人的m的最小值。 輸入樣例: 4 輸出樣例: 30 程序: program program2; var i, ...
什么叫殺人游戲?怎么玩?
殺手: 隱藏在好人中間 好人:白天和大家一起抓出壞人;黑夜閉眼,對(duì)殺手行兇完全不知游戲規(guī)則:以8人為例1、根據(jù)人數(shù)準(zhǔn)備好8張牌,按照不同的花色事前規(guī)定好法官(大王)1人、殺手(K)2人、好人(其他無(wú)花色牌)5人。2、每人取一張牌,明確自己的身份,除法官外,不要讓任何人知道。3、法官宣布:所有人閉上眼睛,殺手...
歇后語(yǔ)10個(gè),成語(yǔ)10個(gè)快告我
案板底下放風(fēng)第——飛不起來(lái) 庵廟里的尼姑——沒(méi)福(夫)矮子騎大馬——上下兩難 矮子坐高登——上下兩難 矮子坐高凳——夠不著 接著葫蘆挖籽——挖一個(gè)少一個(gè) 接著腦袋往火炕里鉆——憋氣窩火 接著中頭喝水——勉強(qiáng)不得 (比喻不能強(qiáng)迫人去做不愿做的事。)矮子推掌——出手不高 矮子爬坡——...
成語(yǔ)詞典名言警句,歇后語(yǔ),俗語(yǔ),諺語(yǔ),繞口令
阿拉伯?dāng)?shù)字8字分家——零比零(0:0) 阿公吃黃連——苦也(爺) (比喻雙主旗鼓相當(dāng), 不分勝負(fù)、 高下、優(yōu)劣.) 阿斗當(dāng)皇帝——軟弱無(wú)能案板底下放風(fēng)第——飛不起來(lái)庵廟里的尼姑——沒(méi)福(夫) 矮子騎大馬——上下兩難矮子坐高登——上下兩難矮子坐高凳——夠不著接著葫蘆挖籽——挖一個(gè)少一個(gè)接...
相關(guān)評(píng)說(shuō):
東港區(qū)太陽(yáng): ______ 一個(gè)人是好人還是壞人 和 一個(gè)人有優(yōu)缺點(diǎn)是兩個(gè)不同的概念. 優(yōu)點(diǎn)不等同于好人 缺點(diǎn)不等同于壞人 好人、壞人是指一個(gè)人的品行,一個(gè)人雖然有缺點(diǎn),但是如果這個(gè)缺點(diǎn)并不對(duì)別人構(gòu)成傷害、危害,那么就不能說(shuō)他是壞人.一個(gè)人雖然有優(yōu)點(diǎn),但是他也經(jīng)常做傷害他人的事情,那么就不能說(shuō)他是好人. 每個(gè)人都有好的一面和不好的一面,因?yàn)槿瞬皇菣C(jī)器,人有思想、有感情,不可能事事做得完美,處處都得到認(rèn)可,否則世界都是千篇一律的"完人",這個(gè)世界還會(huì)這么豐富多彩么?
東港區(qū)太陽(yáng): ______ 約瑟夫問(wèn)題: #include<iostream.h> struct Node { int data; Node *pNext; }; void main() { int n,k,m,i; Node *p,*q,*head; cout<<"輸入n的值:"; cin>>n; cout<<"輸入起始報(bào)數(shù)人號(hào)碼k的值:"; cin>>k; cout<<"輸入 數(shù)到m出列的m的值:...
東港區(qū)太陽(yáng): ______ Hanoi雙塔問(wèn)題 var i,n,t:longint; begin read(n);t:=1; for i:=1 to n do t:=2*t; dec(t);t:=t*2; writeln(t); end.
東港區(qū)太陽(yáng): ______ 自己寫的 C++程序 希望對(duì)你有幫助 /*約瑟夫環(huán) Joseph 是一個(gè)數(shù)學(xué)的應(yīng)用問(wèn)題: 已知n個(gè)人(以編號(hào)1,2,3...n分別表示) 圍坐在一張圓桌周圍.從編號(hào)為k的人開(kāi)始報(bào)數(shù),數(shù)到m的那個(gè)人出列;他的下一個(gè)人又從1開(kāi)始報(bào)數(shù),數(shù)到m的那個(gè)人又出列...
東港區(qū)太陽(yáng): ______ 首先,你要求的只是M,而求出M的前提是壞人全部出列,也就是說(shuō)你可以把問(wèn)題簡(jiǎn)化下.每次...
東港區(qū)太陽(yáng): ______ #include typedef struct num { int data; struct num *next; }node; int main() { node *p1,*p2,*head; int i,m,n,count=1; scanf("%d %d",&n,&m); head=p1=(node*)malloc(sizeof(node)); for(i=0;i { p2=(node*)malloc(sizeof(node)); p2->data=i+1; p1->...
東港區(qū)太陽(yáng): ______ 你好 加個(gè)判斷行不行 下標(biāo)超過(guò)19 就置為0:while(s if(j>=19){ j=0; }else{ j=(j+1); } s+=data[j]; }
東港區(qū)太陽(yáng): ______ 有兩個(gè)問(wèn)題 1、指針沒(méi)有移對(duì) 2、結(jié)點(diǎn)刪除有問(wèn)題 scanf("%d,%d,%d",&n,&k,&m); node *head,*h=(node*)malloc(sizeof(node)); head=h; h->num=1; for(i=2;i<=n;i++) {h->next=(node *)malloc(sizeof(node)); h=h->next; h->...