U536834 【自制游戏】折叠迷宫
题目背景
折叠迷宫,是一款十分烧脑的纸上游戏,因为他走每一步都有非常多种可能性,解谜时需要极强的立体空间感和平面感。
规则:一张纸,上面分成固定的格子,在格子里面有一些设计好画的线,令其中一条线的一段为起点,另一端为终点,并要求你从起点沿着线走到终点。
与迷宫不同的是,其中的线画的都是断断续续,基本没有连在一起,所以想要正常走是不可能的。所以,在走的时候,你可以沿着格线(只能沿着格线!)把纸折起来,并在折起来后那条死胡同可能就会意外地被接上了。
折的时候也不是简单地对折,你可以折许多次,比如一个$\tt 4 \times 4$的格子的纸,如果你想让正面第一列第二行的格子和第四列第四行的格子相邻在一起,你可以先把右边两列向后对折,变成一个$\tt 2 \times 4$的两层的格纸,然后再把第四行向上折上去,这样就能让第四列第四行与第一列第二行相邻了。
值得注意的是,背面也是画了一些线的,也就是说,你可以巧妙运用背面的线,好让你更好的到达终点。
这种游戏之所以烧脑,是因为你为了让一个死胡同接上另一条线,你可能需要折非常多次才能走几步,而走到终点,你可能需要经过成千上百次的尝试,而且可能还有以假乱真的岔路让你分心。
但是,编写一个程序,就有可能再一秒钟之内解决完这个问题。
题目描述
给出一个折叠迷宫,给出最佳方案。最佳方案是指$折叠次数 \times最短路径长度$,如果有多个,请列举。
注意:每一个最佳方案都需要输出具体步骤,对折和行走到具体的点位都要描述清楚
输入格式
第一行,两个整数$\tt n,m$代表迷宫的长和宽
第二行,两个整数$\tt wn,wm,ws$分别代表迷宫一个格子的长、一个格子的宽和格子的数量
接下来,输入迷宫。
首先是$\tt n \times m$的正面迷宫地图,其中每一个点用一个数字表示,`1`代表是黑线,可以走,`0`,代表是空白区域,不能走。
然后是$\tt n \times m$的反面迷宫地图,其中每一个点用一个数字表示,`1`代表是黑线,可以走,`0`,代表是空白区域,不能走。
正反地图当中的点会有两个不用数字表示,一个是`S`,另一个是`E`,`S`代表起点,`E`代表终点
输出格式
如果迷宫无解,输出`NaN`即可
如果迷宫有解:
第一行,一个整数$\tt ans$,代表迷宫解法的数量
接下来是$\tt ans$组数据,每组数据:
先写序号,比如第一种是`No.1`,第二种是`No.2`
先从起点开始,格式如下:
比如我从正面(1,1)开始,走到正面(1,2),再连走两格走到正面(3,2),这么表示
`u(1,1)->u(1,2)->u(3.2)`
u代表正面,改成v就代表反面
注意:不是一步一步走,如果在同一条线上,可以连走两步,但是中间可能有岔路,所以编程的时候不可以把线看作是单纯的连接两点的路,还是要一个一个点来去分析。
如果需要折叠,那么就请换行,这么写:
比如我要将第$\tt x$列格子及以右的格子往里折,这么写:
`(x>)[^]`
改成及以左就把`>`改成`v(5,5)`
走过去之后,如果要把纸复原,则换个行,输出`back`
注意,最后到达的点一定是终点
说明/提示
$\tt 1 \le n,m \le 20,1 \le wn \le n,1 \le wm \le m$
$\tt ws \le n \times m$
[题解](https://www.luogu.com.cn/paste/0gqt4mg8)