VIM-adventures

Problem Description
http://vim-adventures.com/
vim是一个非常方便的文本编辑器,使用它可以快速的编辑文本
vim-adventures是一个很有意思的解谜游戏,需要玩家使用一些vim下的指令来移动光标来解决一系列谜题



为了化简题意此题我们只考虑如下指令:
h:让光标向左边移动一格
j:让光标向下边移动一格
k:让光标向上边移动一格
l:让光标向右边移动一格
w:让光标移动到下一个"word的开头"
e:让光标移动到下一个"word的结尾"
b:让光标移动到前一个"word的开头"
ge:让光标移动到前一个"word的结尾"
W:让光标移动到下一个"WORD的开头"
E:让光标移动到下一个"WORD的结尾"
B:让光标移动到前一个"WORD的开头"
gE:让光标移动到前一个"WORD的结尾"
(注意断句,是"下一个|word的结尾",而不是"下一个word|的结尾".如"1234 5678",2的下一个word的结尾是4而不是8,其他同理)

注:
其中一个word由字母/数字/下划线序列或者其他的非空字符序列组成.由white space(空格或者换行符)分开;
其中一个WORD由非空字符序列组成.由white space(空格或者换行符)分开;
下一个/前一个word/WORD可以跨行,如当前word是该行最后一个word,那么下一个word就是下一行的第一个word;
如果没有下一个/前一个word/WORD,那么按下w/e/b/ge/W/B/E/gE之后会让光标移动到所能移动的最远处;

例子:
This is a line with example text
<----<--<-<----<----<-------<---
  b    b b  b    b     b      b 
This is a line with example text
<--<--<-<----<----<-------<-----
 ge ge ge ge   ge     ge    ge  
This is a line with example text
----->-->->---->---->------->-->
   w  w  w  w    w      w     w 
This is a line with example text
--->-->->---->---->------->---->
 e  e  e  e     e      e      e 
while ((((true)))) printf("Hello VIM!")
------>--->--->---->------------->-->->
   w    w   w    w      W         w  w 


(w,e,b,ge,W等表示按下该键后可以让当前光标移动到对应的"<",">"位子.
前两个例子光标一开始在最右,后三个例子光标一开始在最左)


文本中还有一些不能走上去的位置,如上图中的石头,这些石头光标不管怎么样都没办法移动上去.
现在给你一段文本,要求你从起点位置按最少的按键将光标移动到终点位置.
其中ge算两次按键,大写字母如W可以按shift+w(算两次按键),或者在Caps Lock打开的状态下按一下w,打开/关闭Caps Lock算一次按键.
shift不能按住不放,如在Caps Lock大写的情况下, 按下shift+G和shift+E来实现ge算4次按键.
起始状态Caps Lock是在小写状态

Input
第一行一个整数T代表接下去有T组数据
每组数据第一行是六个整数N,M,sx,sy,ex,sy.其中N,M代表文本的尺寸,(sx,sy)代表起点位置,(ex,ey)代表终点位置,下标从0开始
接下去N行,每行有M个字符,代表文本
接下去N行,每行有M个字符,代表石头,如果是0则表示没有石头,如果是1则表示有石头

[Technical Specification]
0<T<=50
0<N,M<=250
0<=sx,ex<N
0<=sy,ey<M
代表文本的N*M矩阵所有字符的ascii码在32到126之间
每行字符都不以空格开头/结尾
代表石头的N*M矩阵只会包含0或者1
起点和终点一定没有石头

Output
首先输出case数(见sample),接着输出最小的按键使得光标从起点移动到终点.如果走不到终点则输出-1.

Sample Input
  
  
8 1 10 0 0 0 9 wwwwwwww w 0111111110 1 10 0 0 0 9 WWW.WWWW W 0111111110 1 10 0 0 0 9 e eeeeeeee 0111111110 1 10 0 0 0 9 E EEEE.EEE 0111111110 1 10 0 9 0 0 bbbbbbbb b 0111111110 1 10 0 9 0 0 BBBBB.BB B 0111111110 1 10 0 9 0 0 . gegegege 0111111110 1 10 0 9 0 0 . gEgE..gE 0111111110

Sample Output
  
  
Case #1: 1 Case #2: 2 Case #3: 1 Case #4: 2 Case #5: 1 Case #6: 2 Case #7: 2 Case #8: 3
Hint
更多例子可以到vim-adventures.com玩一玩前三关(免费) 游戏一开始只能使用hjkl四个按键,其他按键要到后边关卡吃到对应按键才能用 第一关过河的那个地方是一个难点,要注意小人的提示 在游戏中输入:help [指令]可以查看指令使用方法以及例子

Source
2013腾讯编程马拉松复赛第二场(3月30日)  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值