标题: |
再解炸弹人 |
标签: |
搜索 深度优先搜索 广度优先搜索 |
详情: |
现在炸弹不是想放在那里就能放在那里的了,必须由小人能够走到的地方才能放置炸弹。比如下面这个例子小人默认站在(3,3)这个位置。请问放在何处最多可以消灭多个敌人。
|
输入格式: |
第一行4个整数为n m x y,分别n和m表示迷宫的行和列,x和y表示小人的起始坐标(从0行0列开始计算),接下来的n行m列为地图。
1<=n,m<=50 |
输出格式: |
最多可以消灭的敌人数。 |
样例: |
输入 13 13 3 3 ############# #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# #############
|
输出 10 |
解释 将炸弹放置在(7,11)处,最多可以消灭10个敌人。 |
|
#include <iostream>
#include <string>
#include <queue>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
string a[51];
int b[51][51];
int n,m,res=0;
typedef struct Node{
int x,y;
}N;
queue<N> que;
void getNum(int x,int y){
int sum=0;
int i=x,j=y;
while(a[i][j]!='#'){
if(a[i][j]=='G')
sum++;
i++;
}
i=x,j=y;
while(a[i][j]!='#'){
if(a[i][j]=='G')
sum++;
i--;
}
i=x,j=y;
while(a[i][j]!='#'){
if(a[i][j]=='G')
sum++;
j++;
}
i=x,j=y;
while(a[i][j]!='#'){
if(a[i][j]=='G')
sum++;
j--;
}
if(sum>res)
res=sum;
}
int main(int argc, char** argv) {
int x,y;
cin>>n>>m>>x>>y;
for(int i=0;i<n;i++)
cin>>a[i];
N node; node.x=x; node.y=y;
que.push(node);
getNum(x,y);
b[x][y]=1;
int next[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
while(!que.empty()){
for(int k=0;k<4;k++){
x=que.front().x+next[k][0];
y=que.front().y+next[k][1];
if(x<0 || x>=n || y<0 || y>=m)
continue;
if(a[x][y]=='.' && !b[x][y]){
b[x][y]=1;
node.x=x; node.y=y;
que.push(node);
getNum(x,y);
}
}
que.pop();
}
cout<<res<<endl;
return 0;
}