在你的位置放置一个炸弹,放在哪点能杀最多的敌人,你的位置不能和敌人相同
输入
13 13 3 3
#############
#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#
#############
输出
将炸弹放置在(7,11),最多可以消灭 10 个敌人
#include<stdio.h>
char a[20][21];
int book[20][20],max,mx,my,n,m;
int getnum(int i,int j)
{
int sum,x,y;
sum = 0; // sum 用来 计数(可以消灭的敌人数),所以需要初始化 0
// 将坐标 i,j 复制到 两个新变量 x,y 中,以便以后 向上下左右四个方向统计 可以消灭的的人数
//向上 统计消灭 的敌人数
x = i; y = j;
while(a[x][y] != '#') // 判断的点是不是墙,如果不是墙就继续
{
// 如果当前的点是敌人,则进行计数
if(a[x][y] == 'G') sum++;
// x-- 的作用是继续向 上 统计
x--;
}
//向下 统计消灭 的敌人数
x = i; y = j;
while(a[x][y] != '#') // 判断的点是不是墙,如果不是墙就继续
{
// 如果当前的点是敌人,则进行计数
if(a[x][y] == 'G') sum++;
// x++ 的作用是继续向 下 统计
x++;
}
//向左 统计消灭 的敌人数
x = i; y = j;
while(a[x][y] != '#') // 判断的点是不是墙,如果不是墙就继续
{
// 如果当前的点是敌人,则进行计数
if(a[x][y] == 'G') sum++;
// y-- 的作用是继续向左 统计
y--;
}
//向右 统计消灭 的敌人数
x = i; y = j;
while(a[x][y] != '#') // 判断的点是不是墙,如果不是墙就继续
{
// 如果当前的点是敌人,则进行计数
if(a[x][y] == 'G') sum++;
// y++ 的作用是继续向 右 统计
y++;
}
return sum;
}
void dfs(int x,int y)
{
// 定义一个 用于 走的方向 的数组
int next[4][2] ={
{0,1}, // 向右走
{1,0}, // 向下走
{0,-1}, // 向左走
{-1,0} // 向上走
};
int k,sum,tx,ty;
sum = getnum(x,y);// 计算当前这个点消灭的 敌人总数
if(sum > max)
{
// 如果当前的 点 统计出的 所能消灭 的敌人数 大于 max ,则更新 max,并用 mx,my 记录当前的点的 坐标
max = sum;
mx = x;
my = y;
}
// 枚举 四个 方向
for(k = 0; k <= 3; k++)
{
// 下一个结点的坐标
tx = x + next[k][0];
ty = y + next[k][1];
// 判断是否越界
if(tx < 0 || tx > n - 1 || ty < 0 || ty > m - 1) continue;
if(a[tx][ty] == '.' && book[tx][ty] == 0)
{
book[tx][ty] = 1; // 标记这个点已经走过
dfs(tx,ty);
}
}
return ;
}
int main()
{
int i,startx,starty;
scanf("%d%d%d%d",&n,&m,&startx,&starty);
// 读入 n 行 字符
for(i = 0; i <= n - 1; i++)
scanf("%s",a[i]);
// 从 你 站的位置开始 尝试
book[startx][starty] = 1;
max = getnum(startx,starty);
mx = startx;
my = starty;
dfs(startx,starty);
printf("将炸弹放置在(%d %d),最多可以消灭 %d 个敌人\n",mx,my,max);
return 0;
}
广度优先搜索之最大杀敌数
最新推荐文章于 2021-07-08 09:59:56 发布