#autumnfest11. [autumn_fest_11]Batch Style Mastermind

[autumn_fest_11]Batch Style Mastermind

配点

満点

150

部分点

100


问题描述

进行猜数字游戏(MasterMind,hit和blow)。

基本的MasterMind规则如下:

  1. 主持人选择一个由9位数字('0'-'9')组成的字符串作为答案。答案中可以有重复数字,并且第一位数字可以是0。
  2. 参与者猜测一个由9位数字组成的字符串作为答案。
  3. 主持人根据猜测回答给出两个整数:hit和blow。
    • hit表示在答案和猜测中位置相同且数字相同的个数。
    • blow表示在去除了hit的数字后,在答案和猜测中都出现过的数字的个数。即计算交集的大小。“在答案和猜测中都出现过但位置不同的数字的个数”。
  4. 当参与者的猜测与答案一致时结束游戏。否则回到步骤2。

下面是hit和blow的例子。为了简洁起见,示例中使用了4位数字而不是9位数字。

答案

猜测

hit

blow

0123

0134

2

1

0123

1199

1

0

0123

9911

0

1

1123

9911

0

2

0113

3911

1

2

不过,请注意,这里的MasterMind有一些不同之处,并附加了以下条件:

  • 参与者为了猜测答案,一次性发送由9个由'0'-'9'组成的字符串(我们称之为"test")。随机排列的代表每个字符串的hit和blow数对将以随机顺序返回。
  • 如果通过多次测试可以猜出正确答案,则只需要发送一个由'0'-'9'组成的9位字符串(我们称之为"challenge")。如果发送的字符串与答案相匹配,则输出Accepted,否则输出Wrong Answer。
  • 在一个测试用例中,不能多次使用相同的test。即使是在多个测试用例中也不行。
  • 最多进行20次test。
  • 只能进行一次challenge。

下面的情况将导致运行错误:

  • 调用test的次数超过规定次数。
  • 在test中多次使用相同的字符串。
  • 发送的字符串不符合指定的格式要求。

如果所有测试用例都正确,那么将选择test次数最多的测试用例作为T,并且给予以下分数:当10<=T<=2010<=T<=20时得100分,当T<10T<10时得150分。


输入输出格式

执行test时,将9个由'0'-'9'组成的字符串以空格分隔的形式输出到标准输出。

示例:

printf("? %s %s ... %s\\n", t[0], t[1], ... t[8]);
fflush(stdout);

测试结果将从标准输入中读取18个整数。

示例:

int hit, blow;
for (int i = 0; i < 9; ++i) {
  scanf("%d %d", &hit, &blow);
  // 使用hit和blow
}

执行challenge时,将9位由'0'-'9'组成的字符串以空格分隔的形式输出到标准输出。

示例:

printf("! %s\\n", answer);
fflush(stdout);

输入输出样例

假设答案是"123456788",那么一个输入输出的例子如下所示。

程序输出

程序输入

? 111111111 222222222 333333333 444444444 555555555 666666666 777777777 888888888 012345678

1 0 1 0 2 0 1 0 1 7 1 0 1 0 1 0 1 0

? 000000000 000000001 000000002 000000003 000000004 000000005 000000006 000000007 000000008

0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0

......

......

! 123456789


Writer: tomerun


Source Name

Autumn Fest