2018 年,由南京航空航天大学(NUAA)主办的国际大学生程序设计竞赛(ICPC)区域赛在时隔多年后再次在南京举行。比赛共有超过 400 支队伍参加,来自清华大学的 Power of Two 队获得了冠军。
两年过去了,在 2018 年和 2019 年取得巨大成功之后,NUAA 继续在 2020 年举办 ICPC 南京区域赛。虽然由于疫情原因我们这次无法在南京相聚,但我们仍应感谢所有为本次比赛付出辛勤工作的教职工和志愿者。感谢你们为本次比赛做出的巨大贡献!
在 2018 年的比赛中,K 题《袋鼠拼图》(Kangaroo Puzzle)要求参赛者为游戏构建一个操作序列。让我们先回顾一下该题的内容:
该拼图是一个 $n$ 行 $m$ 列的网格($1 \le n, m \le 20$),其中有一些(至少 2 个)袋鼠站在拼图中。玩家的目标是控制它们汇合到一起。拼图中某些格子有墙,袋鼠不能进入有墙的格子。其余格子为空地。袋鼠可以从一个空地向四个方向(上、下、左、右)移动到相邻的空地。保证袋鼠可以通过相邻的空地从任意一个空地到达其他任何空地。同时保证拼图中不存在环——也就是说,袋鼠不可能从一个空地出发,经过若干不同的空地,最后回到起始的空地。
初始时,每个空地中恰好有一只袋鼠。玩家可以通过键盘上的 U、D、L、R 键来控制袋鼠。袋鼠会根据你按下的按键同时移动。例如,如果你按下 R 键,如果袋鼠右侧存在格子且为空地,它会向右移动一格;如果右侧不存在格子或不是空地,它将保持不动。
在本题中,参赛者需要构建一个长度不超过 $5 \times 10^4$ 的操作序列,仅由 U、D、L、R 组成。如果在按顺序执行这些操作后,仍有两只袋鼠站在不同的格子里,参赛者将获得“Wrong Answer”判罚。
我们亲爱的朋友 Kotori 也参加了那场比赛,并提交了一份随机算法的代码。令她惊讶的是,这个简单的解法被判定为正确答案。我们现在展示她的解法如下:
#include <bits/stdc++.h>
char s[5] = 'UDLR';
using namespace std;
int main()
{
srand(time(NULL));
for (int i = 1; i <= 50000; i++) putchar(s[rand() % 4]);
return 0;
}
对于不熟悉 C 和 C++ 的参赛者:上述代码将输出一个长度为 $5 \times 10^4$ 的随机字符串,仅包含字符 'U'、'D'、'L' 和 'R',其中每个字符在字符串的每个位置出现的概率相等。
Kotori 怀疑这个问题的实际情况可能并没有那么简单,所以现在,在 2020 年 ICPC 南京区域赛中,你需要构造一组输入数据来破解她的解法。由于随机性的存在,你的输入数据只需要满足至少 25% 的成功破解率。形式化地说,我们准备了 500 个根据 Kotori 的代码随机生成的字符串,并将它们作为控制序列来测试你的答案。为了使你的答案被接受,在将你的答案作为地图并执行整个控制序列后,必须至少有 125 次结果显示仍有袋鼠在不同的格子里。
注意,你的输入数据必须是完全合法的。也就是说:
- 你答案中的地图大小不得超过 $20 \times 20$;
- 你的答案应包含至少两个空地;
- 你答案中的所有空地都应能从任意一个空地出发到达;
- 不允许存在由空地组成的环。
输入格式
本题没有输入。一切由你决定!
输出格式
你首先需要输出一行,包含两个空格分隔的整数 $n$ 和 $m$($1 \le n, m \le 20$),表示你答案中地图的行数和列数。
然后输出 $n$ 行,第 $i$ 行包含一个长度为 $m$ 的二进制字符串 $s_{i,1}s_{i,2} \dots s_{i,m}$($s_{i,j} \in \{'0', '1'\}$)。如果 $s_{i,j} = '1'$,则表示第 $i$ 行第 $j$ 列的格子为空地;否则,该格子包含墙,无法进入。
再次提醒,你的答案只需要达到至少 25% 的成功破解率。没那么难,对吧?
样例
输入 1
(无输入)
输出 1
3 4 1111 1010 1100
说明
我们提供的样例输出(显然)是不正确的。它仅用于展示输出格式。这是一个 $3 \times 4$ 的地图,有 4 面墙,因此初始时在空地中会有 8 只袋鼠。