Time Limit: 1000 MS Memory Limit: 65535 Kb |
Total Submission: 8 Accepted: 3 |
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
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; }