题面描述
Ryan 最近迷上了弹幕游戏。所谓弹幕游戏,指的是玩家操控一位角色对来袭的大量敌人进行攻击,并在过程中升级、强化自我的能力,最终打败 Boss 的一类游戏。
“控制着主人公在枪林弹雨中穿行而不中弹的感觉真是太爽了!”—— Ryan
作为一个资深弹幕游戏玩家, Ryan 现在已经不再执着于不中弹,了,而是把目光转移到了所谓的“擦弹”这种高端游戏方式上。
“擦弹”是指玩家紧靠子弹而又不中弹的行为。如图所示。
图中“*”表示子弹,“ . ”表示空位。主人公每次可以往上下左右方向移动一格。按照箭头的走法,就可以擦到紫色的子弹,擦弹数量为 4 。
注意,一个子弹即使被擦弹多次,但只会被计 1 次。
现在 Ryan 面前有一些固定不动的子弹,他想知道在不中弹的前提下,最大的擦弹数是多少。
输入数据
输入数据有多组,第一行是数据组数 T(T ≤ 50) 。每组数据的第一行为两个整数 n 和 m ,表示屏幕的规格是 n*m(n 行 m 列 ) 。第二行为两个整数 x 和 y ,表示主人公起始点在 x 行 y 列。接下来 n 行是一个 n*m 的矩阵,仅由 "*" 和 "." 组成 (1 <= n, m <= 500, 1 <= x <= n, 1 <= y <= m) 。保证起始点一定没有子弹,即矩阵的 (x,y) 处一定为 "." 。
输出数据
对每组数据在单独的一行中输出结果,格式为“ Case #k: result ” ( 冒号后有空格 ) ,表示第 k 组数据对应主人公最大的擦弹数量为 result 。
样例输入
|
样例输出
|
解题思路
遍历查询,结合递归调用就能解决。在这个过程中,控制移动位置我用了以下代码实现,竟然是 :RE无效内存引用。但是数组并没有溢出,不知道是什么原因。后来就采用了算是别人代码的思想吧,直接给出移动位置,逐步访问即可。
出错的代码片段
for (int i = -1 ; i <= 1 ; i++)// 移动顺序:上->左->右->下
for (int j = -1 ; j <= 1 ; j++){
if (fabs(i) != fabs(j) && Gamemap[x+i][y+j] != '0'){// 保证移动位置是上下左右
全部程序代码如下