输入小S的位置,现在他要在某个空地防止一枚炸弹,小s移动过程中不能走到敌人的位置上,否则会被敌人杀死,如果有砖块挡住,也不能过去,现在找一个空地,使得炸弹消灭敌人最多(炸弹可以消灭同行同列的敌人,但不能穿过砖块)‘.’表示空地,‘G’表示敌人,‘#’表示砖块
BFS搜索
#include<iostream>
#include<queue>
using namespace std;
//四个方向
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
char a[1010][1010];//存地图
int n,m,startx,starty;
struct node
{
int x;
int y;
node(int xx,int yy)
{
x=xx;
y=yy;
}
};
int v[1010][1010];
queue<node>q;
int ans,ansx,ansy;
int getnum(int i,int j)
{
int sum=0,tx,ty;
//向左计算敌人的数量
tx=i,ty=j;
while(a[tx][ty]!='#')
{
if(a[tx][ty]=='G')
sum++;
ty--;
}
//向右
tx=i,ty=j;
while(a[tx][ty]!='#')
{
if(a[tx][ty]=='G')
sum++;
ty++;
}
//向上
tx=i,ty=j;
while(a[tx][ty]!='#')
{
if(a[tx][ty]=='G')
sum++;
tx--;
}
//向下
tx=i,ty=j;
while(a[tx][ty]!='#')
{
if(a[tx][ty]=='G')
sum++;
tx++;
}
return sum;
}
int main()
{
cin>>n>>m>>startx>>starty;
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
}
q.push(node(startx,starty));
v[startx][starty]=1;
while(!q.empty() )
{
for(int k=0;k<4;k++)
{
int nx=q.front().x+dir[k][0];
int ny=q.front().y+dir[k][1];
if(nx<0||nx>=n||ny<0||ny>=m)
continue;
if(a[nx][ny]=='.'&&v[nx][ny]==0)
{
v[nx][ny]=1;
q.push(node(nx,ny));
int sum=getnum(nx,ny);
if(sum>ans)
{
ans=sum;
ansx=nx;
ansy=ny;
}
}
}
q.pop() ;
}
cout<<ans<<endl;
cout<<ansx<<" "<<ansy;
return 0;
}