问题
大家小时候玩的那个炸弹人游戏
你放置炸弹,这只有一枚,但是他威力超强,请问炸弹放在哪可以消灭最多的敌人
#是墙 .是空地 G是敌人
第一行输入 场地范围 行 列
/*dfs版本*/
#include <stdio.h>
char a[20][21]; //地图
int book[20][21], max, mx, my, n, m;
//枚举炸弹可以消灭多少敌人
int getnum (int i, int j);
//深搜查找炸弹人能到达的坐标
void dfs(int x, int y);
int getnum (int i, int j) {
int sum, x, y;
sum = 0; //初始化为零,后用于计可以消灭的敌人数
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++; //向右
}
return sum;
}
void dfs (int x, int y) {
int next[4][2] = { {0, 1}, //向右
{1, 0}, //向下
{0, -1}, //向左
{-1, 0} //向上
}; //(x 坐标为行变换,y 坐标为列变换)
int k, sum, tx, ty;
sum = getnum(x, y); //当前点可消灭敌人个数
if(sum > max){
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;
//n行m列
scanf("%d %d %d %d", &n, &m, &startx, &starty);
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;
}