规则
用放置炸弹的方法来消灭敌人,,须将画面上的敌人全部消灭后并找到隐藏在墙里的暗门才能过关。
游戏图片
题目要求
现有一个特殊关卡,只有一枚炸弹,但是这枚炸弹威力超强(炸弹的爆炸方向是沿上下左右四个方向),请问放在那里可以消灭最多的敌人
分析
本实验使用枚举算法(又叫做穷举算法)
先将整个地图模型化,墙用#表示,这里有两种墙,可以被炸和不可以被炸,但是现在由于只有一枚炸弹且炸弹不能穿墙,所以都可以看成不可以被炸的。敌人用G表示,空地用 . 表示,炸弹只能放在空地上
模型化的地图- 需要用一个二维字符数组来存储这个地图,至于将炸弹放置在哪一个点可以消灭敌人最多,则需要一个个来尝试,注意,这里说的坐标(x,y)指的是x行y列
- 如何分别统计上下左右四个方向上可以消灭的敌人数?只要搞清一个方向,其他的方向都是一样的。向下统计为例,向下就是y不变,x每次增加1,直到遇到墙为止
while(a[x][y]!='#') { if(a[x][y] == 'G') sun++; //如果可以消灭一个敌人就sum++ x++;继续向下 }
另外几个方向进行统计的坐标变化如下:
坐标变化- 统计哪个空地坐标在四个方向上消灭的敌人最多
注意:此算法没有考虑炸弹人是否能到达该空地
代码:
#include <stdio.h>
int main(void)
{
int n = 13,m = 13;//n行m列
char a[13][13] = {
"#############",
"#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#",
"#############"
};
int i,j,sum,map = 0,p,q,x,y;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
//首先判断这个点是否是平地,只有平地才能被防止炸弹
if(a[i][j] == '.')
{
//sum用来计数(可以消灭的敌人数),需初始化为0
sum = 0;
//将当前坐标i,j复制到两个新变量x,y中,以便向上下左右四个方向分别统计可以消灭的敌人数
//向上统计
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++;
}
//更新map的值,并保存坐标
if(sum > map)
{
map = sum;
p = i;
q = j;
}
}
}
}
printf("Bomb set(%d,%d),Destroy the enemy at most:%d",p,q,map);
getchar();
return 0;
}
结果:
Bomb set(9,9),Destroy the enemy at most:8
网友评论