文档库 最新最全的文档下载
当前位置:文档库 › 约瑟夫环问题

约瑟夫环问题

Description
上世纪初,由多国组成的海盗联军抢劫了一批珠宝准备由一条船运到夏威夷,进行分赃,这些人分别来自日本,美国,法国,英国,意大利五个国家。在海上遇到风暴,船舱进水,无法承载太多人。于是所有海盗站成一个圈,从第一个人开始报数,谁报到指定数字,则跳海;然后从下一个人开始继续从1报数。直到剩下最后一人。在跳海之前,跳海的人需要报出自己的国家和该国出自己以外在船上的剩余人数。


Input
输入数据的第一行数字n为船上海盗人数,第二行m指定数字,第3到n+2行为每个海盗的国籍(a:美国,j:日本,f:法国,e:英国,i:意大利)。


Output
输出一次跳海人的国籍和当时出他之外,该国在船上的海盗人数;


Sample Input
5
2
a
j
f
e
i

Sample Output
I am Japanese 0
I am English 0
I am American 0
I am Italian 0

HINT

本题可以自行编写代码,也可根据下述代码进行修改,以下代码用到了类的动态多态特性。主函数不需要修改,主要是将类定义补完整,考虑应该加那些函数,如何对类进行初始化。(如果你看懂了代码,工作量将非常小,~hoho)



class CPirate {



public:



virtual void Jump()=0;



CPirate * next;



};



class CAmerican:public CPirate {



private:



static int remainNumber;



//以下请自行定义函数或数据成员



};



class CEnglish: public CPirate {



//以下请自行定义函数或数据成员



};



class CItalian: public CPirate



{



//以下请自行定义函数或数据成员



};



class CJapanese: public CPirate



{



//以下请自行定义函数或数据成员



};



class CFrench: public CPirate



{



//以下请自行定义函数或数据成员



};



int main()



{



int numberPirate;



int callID;



char nationality;



cin >> numberPirate>>callID;



CPirate * pHead, *current, *p,*previous;



//建立链表环



for (int n = 0;n < numberPirate; ++n)



{



cin >> nationality;



if (nationality=='a')



p = new CAmerican;



else if (nationality == 'j')



p = new CJapanese;



else if (nationality == 'f')



p = new CFrench;



else if (nationality

== 'e')



p = new CEnglish;



else



p = new CItalian;



if (n==0)



{



pHead = p;



current = p;



}



else



{



current->next = p;



current = p;



}



}



current->next = pHead;



// 开始跳海游戏



previous = current;



current = pHead;



int i = 1;



while (current!=previous)



{



if (i!=callID) //不跳



{



previous = current;



current = current->next;



i++;



}



else //跳



{



previous->next = current->next;



current->jump();



delete current;



current = previous->next;



i = 1;



}



}



return 0;



}


相关文档
相关文档 最新文档