1.问题描述:在炸弹人游戏中,你有一颗炸弹,该炸弹的威力是十字形的,即只能爆出上下左右型的火焰,且火焰不能穿墙,问应该将炸弹放到哪里炸弹才能杀死最多的小怪?(注:该位置必须是炸弹人能有初始位置走到的位置,毕竟炸弹人不能飞,墙或者小怪都能阻挡炸弹人的路径),现在游戏地图如下图所示,炸弹人的位置在(3,3)处。
2.解题思路:需要先将问题抽象出来,我们可以用一个 二维数组 来表示 游戏地图,用 *表示平地,炸弹人可以到,用#表示墙,用$表示小怪,炸弹人初始位置在(3,3),该问题的目标是搜索到地图中的一个点,该点处满足能炸死的小怪最多,所以我们首先需要知道炸弹放在某一位置 (x,y)处时,能炸死多少小怪;
所以,我们的首要目标就是抽象出地图,并得知地图上某点能炸死的小怪数量。
抽象出地图 容易,上面提到的二维数组即可;统计小怪数量,因为炸弹爆炸只能产生“十”字型火路,所以统计(x,y)放置炸弹威力只要统计 该点向上下左右移动(未碰到墙时)遇到的小怪数量即可
C++程序如下:
#include "iostream"
using namespace std;
#include "vector"
#include "string"
class game_boom//声明该类
{
public:
void game_map();//构建地图
int num_boom(int x, int y);//x,y为炸弹放置的位置
public:
vector<string> map;//地图属性
};
//具象问题抽象化,抽象出来地图与人物;用#代表墙,用*代表空地,用$来代表怪物
//地图是一个平面,所以用一个二维数组来代替
void game_boom::game_map()
{
string s0 = "#############";
string s1 = "#$$*$$$#$$$*#";
string s2 = "###*#$#$#$#$#";
string s3 = "#*******#**$#";
string s4 = "#$#*###*#$#$#";
string s5 = "#$$*$$$*#*$$#";
string s6 = "#$#*#$#*#*#*#";
string s7 = "##$***$*****#";
string s8 = "#$#*#$###*#$#";
string s9 = "#***$#$$$*$$#";
string s10 = "#$#*#$#$#*#$#";
string s11 = "#$$*$$$#$*$$#";
string s12 = "#############";
//已知地图是13*13的,所以针