这是一道交互题,本题仅支持 C++。
你们晓得,法老们是最先去过外太空的人。他们发射过首次登陆行星图特摩斯一世(Thutmus I,现在一般叫它火星)的飞船。行星的表面可以建模成由方形单元构成的
如果在两个陆地单元之间存在某条仅由陆地单元构成的路径,而且路径中每两个连续的前后单元都有公共边,则称这两个陆地单元是连通的。行星上的岛屿被定义为两两连通的陆地单元的极大集合。
飞船的任务是统计该行星上岛屿的数量。然而,考虑到飞船的上古电脑,这事儿并不容易。电脑的内存储器
在处理存储器中的数据时,电脑只能访问存储器中的
为了解决电脑能力的局限,法老们搞出了下面的套路:
- 电脑可以分成
个阶段来操作存储器。 - 在阶段
( ),令 , 电脑将对所有的 ,按照 的升序以及每个 上 的升序,处理单元 。换句话说,电脑将按照如下顺序处理这些单元: 。 - 在最后一个阶段(
),电脑仅处理单元 。该阶段结束后,写入到 的值应该等于行星上的岛屿数量,而且该值应以字符串的形式表示成二进制,其中最低有效位对应于字符串的首字符。
下图给出了电脑操作某个
在阶段
在阶段
你的任务是给出一个方法,让电脑能在给定的操作方式下,统计出行星图特摩斯一世上的岛屿数量。
实现细节
你需要实现下面的函数:
string process(string[][] a, int i, int j, int k, int n)
:一个 数组,表示正在被处理的子数组。特别说明,有 ,这里 中的每个元素均为长度恰好为 的字符串,而且串中的字符为 (ASCII 码 )或 (ASCII 码 )。 :电脑当前正在处理的单元的行号和列号。 :当前阶段的序号。 :阶段总数,同时也是行星表面的大小,此时行星表面包含 个单元。- 该函数应返回一个长度为
的二进制表示字符串。返回值将保存在电脑存储器中的 处。 时,是该函数的最后一次调用。在此次调用中,函数应以字符串的形式返回行星上的岛屿数量的二进制表示,其最低有效位对应下标 处的字符(二进制字符串的首字符),次低有效位对应下标 处的字符,以此类推。- 该函数必须独立于任何的静态或全局变量,且其返回值应仅依赖于传递给该函数的参数。
每个测试用例包括 process
函数调用可能不是连续发生的。但是,可以确保对每个场景,会按照题面所描述的顺序来调用函数 process
。
此外,对每个测试用例,你的程序可能会同时运行多个实例。内存限制和 CPU 用时限制将施加在所有这些实例的总和上。任何故意在这些实例之间偷偷传递数据的行为,都将被认定为作弊,选手可能会因此被取消比赛资格。
特别说明,在调用函数 process
时保存在静态或全局变量中的信息,不保证在下次调用时可以读出。
输入格式
评测程序示例读取如下格式的输入:
- 第
行: 。 - 第
个区块( ):该区块表示第 个场景。- 第
行: 。 - 第
行( ): 。
- 第
输出格式
评测程序示例将按照如下格式打印出结果:
- 第
行( ):在第 个场景上,函数process
最后一次的返回值的十进制表示。
样例 1
input
1 1 1 0 0 1 1 0 0 0 1
output
2
explanation
考虑
'1' '0' '0'
'1' '1' '0'
'0' '0' '1'
在本例中,行星表面包括 process
的调用至多只有
在阶段 process
恰好一次:
process([["100","000","000"],["100","100","000"],["000","000","100"]],0,0,0,1)
注意这里仅展示了
该函数应返回
样例 2
input
1 2 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1
output
4
explanation
考虑
'1' '1' '0' '1' '1'
'1' '1' '0' '0' '0'
'1' '0' '1' '1' '1'
'0' '1' '0' '0' '0'
'0' '1' '1' '1' '1'
在本例中,行星表面包括 process
的调用至多只有
在阶段 process
恰好一次:
process([["100","100","000"],["100","100","000"],["100","000","100"]],0,0,0,2)
process([["100","000","100"],["100","000","000"],["000","100","100"]],0,1,0,2)
process([["000","100","100"],["000","000","000"],["100","100","100"]],0,2,0,2)
process([["100","100","000"],["100","000","100"],["000","100","000"]],1,0,0,2)
process([["100","000","000"],["000","100","100"],["100","000","000"]],1,1,0,2)
process([["000","000","000"],["100","100","100"],["000","000","000"]],1,2,0,2)
process([["100","000","100"],["000","100","000"],["000","100","100"]],2,0,0,2)
process([["000","100","100"],["100","000","000"],["100","100","100"]],2,1,0,2)
process([["100","100","100"],["000","000","000"],["100","100","100"]],2,2,0,2)
假定上面调用得到的返回值分别为
"011", "000", "000", "100", "100"
"111", "111", "011", "000", "000"
"110", "010", "111", "100", "100"
"000", "100", "000", "000", "000"
"000", "100", "100", "100", "100"
在阶段 process
一次:
process([["011","000","000"],["111","111","011"],["110","010","111"]],0,0,1,2)
最后,本次函数调用应返回
约束条件
。 。 为 (ASCII 码 )或 (ASCII 码 )(对所有 )。 的长度恰好为 (对所有 )。 中的每个字符均为 (ASCII 码 )或 (ASCII 码 )(对所有 )。
对函数 process
的每次调用,都有:
。 。
子任务
- (
分) 。 - (
分) 。 - (
分) 。 - (
分) 。 - (
分) 。 - (
分) 。 - (
分) 。 - (
分) 。 - (
分) 。 - (
分) 。
时间限制:
空间限制: