再解炸弹人

标题: 再解炸弹人
标签: 搜索 深度优先搜索 广度优先搜索
详情: 现在炸弹不是想放在那里就能放在那里的了,必须由小人能够走到的地方才能放置炸弹。比如下面这个例子小人默认站在(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;
}

猜你喜欢

转载自blog.csdn.net/qq_42835910/article/details/85218997