hdu 3529 炸弹人

你还记得小霸王游戏机上的炸弹人吗?用放置炸弹的方法来消灭敌人。必须将画面上的敌人全部消灭。必须画面上的敌人全部消灭后,并找到隐藏的墙里面的暗门才能过关。
现在有一个特殊的关卡你只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可以消灭杀伤范围内的所有敌人)。请问在哪里放置炸弹才可以消灭最多的敌人呢?
这里写图片描述

题解

将图形化地图转化为字符型二维数组;
#############
#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#
#############

注:  #表示墙
     G表示敌人
    .表示空地
用暴力逐个点的枚举
代码实现
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
   char a[20][21] ; //初始化地图的大小
   int i,j,sum,map=0,p,q,x,y,n,m;
   scanf("%d %d",&n,&m);//地图的行与列
   for(i=0;i<=n-1;i++)
    scanf("%s",a[i]);//输入字符型地图数据

   for(i=0;i<=n-1;i++)
   {
       for(j=0;j<=m-1;j++) //两个循环枚举地图每一个点
        {
            if(a[i][j]=='.')//判断是否为空地,否则不能放置炸弹
            {
                sum=0;//用于对消灭敌人进行计数
                x=i;y=j;
                while(a[x][y]!='#') //四个while分别判断上下左右四个方向,并计数
                {
                    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++;
                }

                if(sum>map) //更新map。知道map值最大,即消灭敌人的最大数量
                {
                    map=sum;
                    p=i;
                    q=j;
                }

            }


        }
   }
   printf("将炸弹放置在(%d,%d),最多可以消灭%d个敌人\n",p,q,map);
   return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章