BJTU 弹幕游戏

题面描述

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 。

样例输入

 

3
4 4
4 3
...*
..**
...*
...*
3 5
2 3
.*.*.
*...*

.*.*.
3 3
2 2
***
*.*
***

 

样例输出

 

Case #1: 4
Case #2: 6
Case #3: 4

 

解题思路

       这个题目看着复杂,其实经过遍历查询,结合递归调用就能解决。在这个过程中,控制移动位置我用了以下代码实现,竟然是 :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'){// 保证移动位置是上下左右

 

全部程序代码如下

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值