你還記得小霸王遊戲機上的炸彈人嗎?用放置炸彈的方法來消滅敵人。必須將畫面上的敵人全部消滅。必須畫面上的敵人全部消滅後,並找到隱藏的牆裏面的暗門才能過關。
現在有一個特殊的關卡你只有一枚炸彈,但是這枚炸彈威力超強(殺傷距離超長,可以消滅殺傷範圍內的所有敵人)。請問在哪裏放置炸彈纔可以消滅最多的敵人呢?
題解
將圖形化地圖轉化爲字符型二維數組;
#############
#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;
}