UVA1170 Jumping Hero
题目描述
**背景**:一天,一个软件公司决定做一个游戏,以迷宫为主题。主角要从起点走到终点。在迷宫中,有一些细胞包含魔法喷泉,可以用来获得超能力。每当主角进入一个有魔法喷泉的牢房时,他会获得超能力。通常情况,主角可以向上/下/左/右移动到一片空地。主角可以用超能力跳到房间的左/右/上/下的第N个位置。超级能力持续M次跳跃,英雄可以在每次跳跃后改变其跳跃方向。如果跳跃的结束单元格在地图中并且不是墙,那么英雄可以跳过墙。如果英雄带着魔法喷泉效果跳到另一个有魔法喷泉的牢房,他将获得新魔法喷泉的超能力,前一个魔法喷泉的效果将被取消。如果英雄跳转到他获得当前超能力的单元格,则不会产生任何效果(也就是说,能力不可叠加,英雄不可以获得额外的超能力)。当当前的超能力结束时,英雄将继续其正常的移动。如果在某个喷泉中获得超能力后,英雄不能移动到任何房间中,他就会失去超能力,回到之前的房间中。为了到达结束位置,英雄必须移动到结束单元格或在结束单元格中完成一次跳跃。
给定迷宫地图,计算从起始位置到结束位置的最小跳跃/移动次数。
输入格式
每个数据集的第一行包含两个正整数,L和C,用一个空格隔开,其中L表示行数,C表示映射中的列数。L和C都小于300。输入的下面L行包含C整数,每一行都定义了映射的单元格(用一个空格分隔)。每个整数i必须解释如下:i = 0表示一堵墙;I = 1表示一个空单元格(英雄可以移动的地方);i = m10 + N表示一个空的单元格,其中有一个魔法喷泉,可以让英雄跳M次,跳到第上/下/左/右的第N个单元格。M的取值范围是1 ~ 5,N的取值范围是2 ~ 6。地图中魔法喷泉的最大数量是5000个。输入的最后两行定义起始位置和结束位置的坐标(坐标由两个整数组成,分别表示从0开始的行和列)。
输出格式
到达结束位置,则输出“impossible”(单独一行,不带引号)在每行数据间空行。
输入样例:
1
8 8
0 1 1 1 1 1 1 1
0 1 0 0 1 13 1 1
0 1 32 1 1 1 0 0
0 1 1 0 1 1 1 0
0 1 1 0 0 0 0 0
0 1 1 1 1 1 1 0
0 1 0 0 1 1 1 0
0 1 1 1 1 1 1 0
1 7
5 4
样例输出:
14