枚举地图位置 啊哈,算法上
程序员文章站
2022-06-02 21:26:06
...
题目:给出一个20*20以内的地图,里面会有墙,敌人,平地,要求是找到最合适的放炸弹的位置,并且能够杀死对应行列的敌人,有墙壁的话就会截止
#include <stdio.h>
int main()
{
char a[20][21]; //定义地图的长度不会超过20*20的
int n,m,i,j,sum,max=0,p,q,x,y;
scanf("%d%d",&n,&m); //n - 行数 m-列数
//开始读入n行字符地图
for(i=0;i<n;i++)
scanf("%s",a[i]);
//进行遍历地图
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
//1.1 首先判断这个点是不是平地
if(a[i][j] == '.')
{
//1.2 是的话...
//2.1 进行不停上下左右遍历
sum=0;
//2.2 设置x,y作为i,j不停往一个位置的遍历
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++;
}
//1.3 是的话进行查找每个点能够击杀的最多人次sum,并且保存i,j的坐标 用p和q来保存
if(sum>max){
max = sum;
p = i,q = j;
}
}//if
}//for
printf("找到能够消灭最大点的位置(%d,%d),能够消灭%d人",p,q,max);
return 0;
}
给出实例:
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#
#############
运行结果: