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;
}