在你的位置放置一个炸弹,放在哪点能杀最多的敌人,你的位置不能和敌人相同 输入 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; }