BJTU 1729 Ryan的弹幕游戏(BFS)

4 篇文章 0 订阅

Ryan的弹幕游戏

Time Limit: 1000 MS    Memory Limit: 65535 Kb
Total Submission: 8   Accepted: 3

Description

 

Ryan最近迷上了弹幕游戏。所谓弹幕游戏,指的是玩家操控一位角色对来袭的大量敌人进行攻击,并在过程中升级、强化自我的能力,最终打败Boss的一类游戏。

 

“控制着主人公在枪林弹雨中穿行而不中弹的感觉真是太爽了!”——Ryan

 

作为一个资深弹幕游戏玩家,Ryan现在已经不再执着于不中弹,了,而是把目光转移到了所谓的“擦弹”这种高端游戏方式上。

“擦弹”是指玩家紧靠子弹而又不中弹的行为。如图所示。

图中“*”表示子弹,“.”表示空位。主人公每次可以往上下左右方向移动一格。按照箭头的走法,就可以擦到紫色的子弹,擦弹数量为4。

 

注意,一个子弹即使被擦弹多次,但只会被计1次。

 

现在Ryan面前有一些固定不动的子弹,他想知道在不中弹的前提下,最大的擦弹数是多少。

Input

输入数据有多组,第一行是数据组数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)处一定为"."。

Output

  对每组数据在单独的一行中输出结果,格式为“Case #k: result” (冒号后有空格),表示第k组数据对应主人公最大的擦弹数量为result

Sample Input

 3

4 4

4 3

...*

..**

...*

...*

3 5

2 3

.*.*.

*...*

.*.*.

3 3

2 2

***

*.*

***

Sample Output

Case 1: 4

Case 2: 6

Case 3: 4

Source

ryan


解题思路:校赛的时候做这道题并没有意识到是BFS搜索,也可能因为对于深搜更熟练一些,上去直接就敲了DFS结果就悲剧了,各种TLE+RTE。。。当时内心真是崩溃的 =v= 后来才从学长那里了解到,如果拿DFS写会爆栈,但当时让我挂了的主要原因可能还是我选择用cin读取数据,今天补题的时候才发现cin对这种搜索的影响是非常大,不过好诧异之前做的那些题居然都过了……还是自己做的太少了,对这些套路了解不够。。解决了这些问题,就是一个简单的BFS搜索问题了。。


代码:

#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

char map[505][505];
//int res[500][500];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int m,n;

struct point
{
    int x,y;
};
queue<point>P;
int BFS( point s )
{
    int num = 0;
    int i;
    P.push(s);
    point hd;
    while(!P.empty())
    {
        hd = P.front();
        P.pop();
        for(i=0;i<4;i++)
        {
            int x = hd.x + dx[i];
            int y = hd.y + dy[i];
            if(x>=1 && x<=n && y>=1 && y<=m && map[x][y]!='@')
            {
                if(map[x][y]=='*')
                {
                    num++;
                    map[x][y] = '@';
                    continue;
                }
                else if(map[x][y]=='.')
                {
                    point t;
                    t.x = x;
                    t.y = y;
                    P.push( t );
                    map[x][y] = '@';
                    continue;
                }
            }
        }
    }
    return num;
}
int main()
{
    //freopen("test.txt","r",stdin);
    int t,x,y;
    int i,j,k;
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {

        scanf("%d%d",&n,&m);
        scanf("%d%d",&x,&y);
        for(j=1;j<=n;j++)
        {
            scanf("%s",map[j]+1);
        }
        /*for(j=1;j<=n;j++)
        {
            for(k=1;k<=m;k++)
            {
                cout << map[j][k];
            }
            cout << endl;
        }*/
        /*if(num_k <= 2)
        {
            printf("Case %d: %d\n",i,num_k);
            continue;
        }*/
        map[x][y] = '@';
        point s;
        s.x = x;
        s.y = y;
        printf("Case %d: %d\n",i,BFS(s));
    }
    //cout << "Hello world!" << endl;
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值