炸弹人(模拟,枚举)
题目描述(ID:12033)
标题: | 炸弹人 | ||
标签: | 模拟 | ||
详情: | 小哼最近爱上了“炸弹人”游戏。你还记得在小霸王游戏机上的炸弹人吗?用放置炸弹的方法来消灭敌人。需将画面上的敌人全部消灭后,并找到隐藏在墙里的暗门才能过关。 现在有一个特殊的关卡如下。你只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可以消灭杀伤范围内所有的敌人)。请问在哪里放置炸弹才可以消灭最多的敌人呢。 我们先将这个地图模型化。墙用 # 表示。这里有两种墙,一种是可以被炸掉的,另外一种是不能被炸掉的。但是由于现在只有一枚炸弹,所以都用 # 表示,炸弹是不能穿墙的。敌人用 G 表示,空地用 . 表示,当然炸弹只能放在空地上。 |
||
输入格式: |
第一行2个整数为n m 表示迷宫的行和列,接下来的n行m列为地图。 1<=n,m<=50 |
||
输出格式: |
输出做最多可以消灭的敌人数 |
||
样例: |
|
解题思路:我们可以找到每一个空地,算出每个空地可以消灭的敌人。最后找到每种情况的最大值即可。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
#define pi 3.1415926
#define mod 1000000007
using namespace std;
typedef long long LL;
const int Max_n=55;
char a[Max_n][Max_n];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",a[i]);
int sum=0,mmax=0,x,y;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='.'){//枚举每一个空地可以消灭的敌人
sum=0;
//向上找敌人
x=i,y=j;
while(a[x][y]!='#'){//不是墙就找敌人
if(a[x][y]=='G')
sum++;
x--;
}
//向下找敌人
x=i,y=j;
while(a[x][y]!='#'){//不是墙就找敌人
if(a[x][y]=='G')
sum++;
x++;
}
//向左找敌人
x=i,y=j;
while(a[x][y]!='#'){//不是墙就找敌人
if(a[x][y]=='G')
sum++;
y--;
}
//向右找敌人
x=i,y=j;
while(a[x][y]!='#'){//不是墙就找敌人
if(a[x][y]=='G')
sum++;
y++;
}
if(sum>mmax)
mmax=sum;
}
}
}
printf("%d\n",mmax);
return 0;
}