1 / 3
文档名称:

调皮的小孩.doc

格式:doc   大小:29KB   页数:3页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

调皮的小孩.doc

上传人:xunlai783 2018/2/25 文件大小:29 KB

下载得到文件列表

调皮的小孩.doc

相关文档

文档介绍

文档介绍:调皮的小孩
【问题描述】
一群小孩在草坪上玩游戏,十分开心,一个喜欢猎奇的过路人走过来问他们:
“孩子们,你们在玩什么游戏呢?”
“我们中有一个人当裁判,剩下的人分成两队:星星队有N个人,月亮队有M个人。如果你猜对了谁是裁判,我就告诉你玩的是什么游戏。”
“好啊。不过,总得给我点提示吧?”
“那当然。你可以问我们某人是不是属于某队,而不能问某人是不是裁判。被问到的星星队的队员总是告诉你正确的答案;月亮队的队员总是告诉你错误的答案;而裁判,在你向他问奇数次的时候他会告诉你正确的答案,偶数次的时候会告诉你错误的答案。”
“哦,明白了。可以随便提问题吗?”
“你不许问任何人关于他自己的问题。例如,你不许问我:‘你是不是星星队的?’你也不能向任何一个人询问两次关于同一个人的问题。例如,你曾问过我丁丁是不是星星队的,你就不能再问我丁丁是不是月亮队的。最后,请你尽量不要问同一个人太多的问题,因为他还要接着玩呢,没时间老回答你的问题。”
过路人很聪明,不仅猜出了谁是裁判,还说出了剩下的每个人是哪个队的。你也来试试吧!
【交互】
本题是一道交互式题目,你的程序应当和测试库进行交互,而不得访问任何文件。测试库提供三个函数:GetNM,Ask,Answer,它们的作用和用法如下:
GetNM(N,M)必须首先调用,用它来获得正整数N,M的值。(2<=N+M<=500)。
Ask(Child1,Child2,T)的作用是询问。其中1<=Child1,Child2<=N+M+1,且Child1≠Child2。T非0即1,T为0表示星星队,为1表示月亮队。即询问小孩Child1“小孩Child2是不是属于T队”。若函数返回1,表示Child1回答说“是”;若函数返回0,表示Child1回答“否”。
Answer(Ans)用来告诉测试库你猜的答案。参数Ans的值为0,1,2。为0表示星星队,为1表示月亮队,为2表示裁判。你应当连续调用N+M+1次本过程,从1号开始到N+M+1号为止依次说明每个小孩的角色,注意仅有一个裁判。调用完N+M+1次本过程后,测试库会终止你的程序,切记你的程序不得自行终止。
【一个成功交互的例子】
函数调用
返回值
说明
GetNM(N,M)
N=1, M=1
星星队和月亮队各有一名队员
Ask(1,2,0)
0
问小孩1:“小孩2是不是星星队的?”答:“否”
Ask(2,1,0)
1
问小孩2:“小孩1是不是星星队的?”答:“是”
Ask(3,1,1)
0
问小孩3:“小孩1是不是月亮队的?”答:“否”
Answer(2)

小孩1是裁判。
Answer(1)

小孩2是月亮队的。
Answer(0)

小孩3是星星队的。
【对Pascal程序员的提示】
你的程序应当使用下列语句引用测试库:
uses childlib;
测试库提供的函数/过程原型为:
procedure GetNM(var N,M:integer);
function Ask(Child1,Child2,T:integer):integer;
procedure Answer(Ans:integer);
【对C/C++程序员的提示】
你应当建立一个工程,把文件childli