你还记得小霸王游戏机上的炸弹人吗?用放置炸弹的方法来消灭敌人。必须将画面上的敌人全部消灭。必须画面上的敌人全部消灭后,并找到隐藏的墙里面的暗门才能过关。
现在有一个特殊的关卡你只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可以消灭杀伤范围内的所有敌人)。请问在哪里放置炸弹才可以消灭最多的敌人呢?
题解
将图形化地图转化为字符型二维数组;
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.###
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############
注: #表示墙
G表示敌人
.表示空地
用暴力逐个点的枚举
代码实现
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char a[20][21] ; //初始化地图的大小
int i,j,sum,map=0,p,q,x,y,n,m;
scanf("%d %d",&n,&m);//地图的行与列
for(i=0;i<=n-1;i++)
scanf("%s",a[i]);//输入字符型地图数据
for(i=0;i<=n-1;i++)
{
for(j=0;j<=m-1;j++) //两个循环枚举地图每一个点
{
if(a[i][j]=='.')//判断是否为空地,否则不能放置炸弹
{
sum=0;//用于对消灭敌人进行计数
x=i;y=j;
while(a[x][y]!='#') //四个while分别判断上下左右四个方向,并计数
{
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>map) //更新map。知道map值最大,即消灭敌人的最大数量
{
map=sum;
p=i;
q=j;
}
}
}
}
printf("将炸弹放置在(%d,%d),最多可以消灭%d个敌人\n",p,q,map);
return 0;
}