现有一个地图。#:表示墙,.:表示空地,G:表示敌人,现在在空地安放炸弹,求可能炸到敌人的数量最多为?
#############
#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#
#############
深搜实现
#include<iostream>
using namespace std;
int n,m,startx,starty,mx,my,max1=0;
const int maxn=1000;
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char arr[maxn][maxn];
int mark[maxn][maxn]={0};
//算炸到敌人总数
int sums(int x,int y)
{
int sum=0,tx,ty;
for(int i=0;i<=3;i++)
{
tx=x+next[i][0];
ty=y+next[i][1];
while((tx>=1&&tx<=n-2)
&&(ty>=1&&ty<=m-2)
&&(arr[tx][ty]!='#'))
{
if(arr[tx][ty]=='G')
{
sum++;
}
tx+=next[i][0];
ty+=next[i][1];
}
}
return sum;
}
//深搜进入
void dfs(int x,int y)
{
//先计算值再进行下一个的探索
int tx1,ty1;
int sum=sums(x,y);
if(sum>max1)
{
max1=sum;
mx=x;
my=y;
}
//探索下一步
for(int i=0;i<=3;i++)
{
tx1=x+next[i][0];
ty1=y+next[i][1];
if(tx1<1||tx1>n-2||ty1<1||ty1>m-2)continue;
if(arr[tx1][ty1]=='.'&&mark[tx1][ty1]==0)
{
mark[tx1][ty1]=1;
dfs(tx1,ty1);
}
}
return ;
}
int main()
{
cin>>n>>m>>startx>>starty;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>arr[i][j];
}
}
//先把初始位置计算
mark[startx][starty]=1;
max1=sums(startx,starty);
mx=startx;
my=starty;
dfs(startx,starty);
cout<<mx<<" "<<my<<endl;
cout<<max1;
return 0;
}
广搜实现
#include<iostream>
using namespace std;
const int maxn=1000;
int n,m,startx,starty,tx,ty,head,tail;
char arr[maxn][maxn];
int mark[maxn][maxn]={0};
int next[4][2]={1,0,-1,0,0,1,0,-1};
//构造队列,包含点的坐标以及炸到敌人数量
struct Queue{
int x;
int y;
int sum;
Queue()
{
sum=0;
}
};
Queue queue[501];
//计算炸到敌人总数
void num(int x,int y,Queue queue[])
{
int tx1,ty1;
for(int i=0;i<=3;i++)
{
tx1=x+next[i][0];
ty1=y+next[i][1];
while((tx1>=1&&tx1<=n-2)
&&(ty1>=1&&ty1<=m-2)
&&arr[tx1][ty1]!='#')
{
if(arr[tx1][ty1]=='G')
{
queue[tail].sum++;
}
tx1+=next[i][0];
ty1+=next[i][1];
}
}
return ;
}
int main()
{
cin>>n>>m>>startx>>starty;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>arr[i][j];
}
}
int max=-10000,mx,my;
//初始化队列
head=1;
tail=1;
//初始点的计算
queue[tail].x=startx;
queue[tail].y=starty;
mark[queue[tail].x][queue[tail].y]=1;
num(queue[tail].x,queue[tail].y,queue);
if(queue[tail].sum>max)
{
max=queue[tail].sum;
mx=queue[tail].x;
my=queue[tail].y;
}
tail++;
//开始进入层层搜索
while(head<tail)
{
for(int i=0;i<=3;i++)
{
//先拿到探索方向
tx=queue[head].x+next[i][0];
ty=queue[head].y+next[i][1];
//如果满足条件入队
if(tx<1||tx>n-2||ty<1||ty>m-2)continue;
if(arr[tx][ty]=='.'&&mark[tx][ty]==0)
{
queue[tail].x=tx;
queue[tail].y=ty;
mark[tx][ty]=1;
num(tx,ty,queue);
if(queue[tail].sum>max)
{
max=queue[tail].sum;
mx=queue[tail].x;
my=queue[tail].y;
}
tail++;//计算结束队列增长
}
}
//当前节点全部结束,回到上一层遍历下一个
head++;
}
cout<<mx<<" "<<my<<endl;
cout<<max;
return 0;
}