题设条件与上一题相同,但是只能在能走到的地方放置炸弹,小人的起始位置为第四行第四列。用'#'代表墙,'.'代表可以走的位置,'G'代表小怪兽。从第0行第0列开始数
由于该题需要考虑到’ . ‘是否能走到,所以这题需要使用广度优先搜索找到他能走到的路径并求出在能走到的点放置炸弹消灭的小怪兽数量。
分析此地图,在(1,11)放置炸弹最多消灭11个小怪兽,但是小人是无法走到这个位置的,所以正确答案应该是在(7,11)放置炸弹最多能消灭10个小怪兽。
/*
*/
int main()
{
char map[20][20];
memset(map,0,sizeof(map));
int q,w,i,j,m=13,n=13,sum=0,flag,f1=0,f2=0;
//scanf("%d %d\n",&m,&n);
for (i=0;i<m;i++)
gets(map[i]);
int stratx=3,straty=3,tx,ty,head=0,tail=0,k,que[400][2],book[20][20];
//book用来标记是否走过这个点
memset(book,0,sizeof(book));
int next[4][2]={0,1,1,0,0,-1,-1,0};
que[tail][0]=stratx;
que[tail][1]=straty;
tail++;
while (head<tail)
{
for (k=0;k<3;k++)
{
//下一个点坐标
tx=que[head][0]+next[k][0];
ty=que[head][1]+next[k][1];
//判断边界
if (tx<0||tx>m-1||ty<0||ty>n-1)
continue;
//判断是否走过
if (map[tx][ty]=='.'&&book[tx][ty]==0)
{
//标记这个点已经走过了
book[tx][ty]=1;
//入队
que[tail][0]=tx;
que[tail][1]=ty;
tail++;
}
}
head++;
}
for (i=1;i<m-1;i++)
{
for (j=1;j<n-1;j++)
{
if (map[i][j]=='.'&&book[i][j]==1)
{
flag=0;
q=i;w=j;
while (map[q][w]!='#')
{
if (map[q][w]=='G')
flag++;
q--;
}
q=i;w=j;
while (map[q][w]!='#')
{
if (map[q][w]=='G')
flag++;
q++;
}
q=i;w=j;
while (map[q][w]!='#')
{
if (map[q][w]=='G')
flag++;
w--;
}
q=i;w=j;
while (map[q][w]!='#')
{
if (map[q][w]=='G')
flag++;
w++;
}
map[i][j]=flag+'0';
if (flag>=sum)
{
sum=flag;
f1=i;
f2=j;
}
}
}
}
//显示地图
/*for (i=0;i<m;i++)
puts(map[i]);*/
printf("在(%d,%d)处放炸弹可以消灭最多%d个小怪兽。",f1,f2,sum);
}