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;
}