#P16857. [NWRRC 2019]Foreach
[NWRRC 2019]Foreach
题目描述
考虑 PHP 中的数组与 foreach。
本题只考虑下标从 开始连续编号的数组:
程序中只有两个变量:数组 $a 和变量 $x。
我们只允许使用以下两种 foreach 循环。
非引用形式:
foreach ($a as $x) // code
引用形式:
foreach ($a as &$x) // code
在非引用形式中,循环依次访问数组元素,并将当前元素的值赋给 $x。因此修改 $x 不会直接修改当前数组元素。
在引用形式中,$x 会成为当前数组元素的引用,因此修改 $x 会同时修改对应数组元素。
此外,本题允许在循环体中使用 if 和 break。break 会立即结束当前循环。
PHP 的一个重要特性是:循环结束后 $x 不会因为离开循环而失效。如果之前执行过引用形式的 foreach,那么 $x 在之后仍然保持为某个数组元素的引用,直到它被重新绑定为另一个引用。
例如,初始数组为 [1,2,3],执行:
foreach ($a as &$x) if ($x == 2) break;
foreach ($a as $x) if ($x == 2) break;
第一次循环结束后,$x 引用数组的中间元素。
第二次循环的第一步会把 $x 的值改为第一个元素的值 1,于是数组变成 [1,1,3];之后继续执行,最终数组变为 [1,3,3]。
可以看到,即使代码中没有显式赋值语句,数组仍然可能被修改。
现在给定初始数组 和目标数组 。你需要只使用题目规定的 foreach 语句,构造一段程序,把数组从 变成 。
输入格式
第一行一个整数 :
第二行包含 个整数 ,表示初始数组:
第三行包含 个整数 ,表示目标数组:
输出格式
如果无法完成转换,输出:
-1
否则,第一行输出程序行数 :
接下来 行,每行必须严格为以下两种格式之一:
foreach ($a as &$x) if ($x == <some integer value>) break;
或
foreach ($a as $x) if ($x == <some integer value>) break;
其中整数必须为 到 。
不允许使用任何其他变量或语言结构。
特别注意输出格式中的空格:非引用形式中 as 与 $x 之间有两个空格。若格式不符合要求,会得到 Wrong Answer。
构造出的程序按照题目定义的形式化规则执行后,必须把 $a 从初始状态转换为目标状态。
样例
样例 1
3
1 2 3
1 3 3
2
foreach ($a as &$x) if ($x == 2) break;
foreach ($a as $x) if ($x == 2) break;
样例 2
2
1 2
1 3
-1