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;
}

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