输入样例:

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#
#############

输出样例:

炸弹放置在(8,12),消灭敌人最多为10

  • 深搜代码:

#include<cstdio>
#include<iostream>
#define INF 10000000
using namespace std;
char a[][];
int b[][];
int next[][]={{,},{,},{,-},{-,}};//四个方向
int maxx=,mx,my,tx,ty,n,m;
int getsum(int x,int y)//计算一共可以消灭的敌人
{
int sum=;
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++;
}
return sum;
} void dfs(int x,int y)
{
int sum=getsum(x,y);
if(sum>maxx)//更新最大值
{
maxx=sum;
mx=x;
my=y;
}
for(int i=;i<;i++)
{
tx=x+next[i][];
ty=y+next[i][];
if(tx>n||ty>m||tx<||ty<)//判断越界
continue;
if(b[tx][ty]==&&a[tx][ty]=='.')//未被标记并且是空地
{
b[tx][ty]=;//此处不用还原标记数组,因为不是找路径而是记录每个点消灭敌人的数
dfs(tx,ty);
}
}
return ;
} int main()
{
int sx,sy;
scanf("%d%d%d%d",&n,&m,&sx,&sy);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf(" %c",&a[i][j]);
dfs(sx,sy);
printf("炸弹放置在(%d,%d),消灭敌人最多为%d\n",mx,my,maxx);
return ;
}
  • 广搜代码:

#include<cstdio>
#include<iostream>
#define INF 10000000
using namespace std;
char a[][];
int b[][];
int next[][]={{,},{,},{,-},{-,}};//四个方向 struct node//用结构体模拟队列
{
int x;
int y; }que[]; int getsum(int x,int y)//计算一共可以消灭的敌人
{
int sum=;
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++;
}
return sum;
} int main()
{
int n,m,sx,sy,tx,ty,mx,my;
scanf("%d%d%d%d",&n,&m,&sx,&sy);
//getchar();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf(" %c",&a[i][j]);
//初始化队列
int head=;
int tail=;
//将起点入队
que[tail].x=sx;
que[tail].y=sy;
tail++;//队尾指针++,队尾指针要指向空队列
b[sx][sy]=;//标记起点
int maxx=getsum(sx,sy);
int flag=,sum;
//开始广搜
while(head<tail)//队列不为空
{
for(int i=;i<;i++)//四个方向搜索
{
//计算从父亲(head)点到下一个点
tx=que[head].x+next[i][];
ty=que[head].y+next[i][];
if(tx<||ty<||tx>n||ty>m)//是否越界
{
continue;
}
if(b[tx][ty]==&&a[tx][ty]=='.')//这个点没有走过并且是空地
{
b[tx][ty]=;//标记走过,此处与深搜不同,不能还原标记
//将此点入队
que[tail].x=tx;
que[tail].y=ty;
tail++;//队尾指针++
sum=getsum(tx,ty);
if(sum>maxx)
{
maxx=sum;
mx=tx;
my=ty;
}
}
}
head++;//四个方向可以进入路径的都已入队,将head出队
}
printf("炸弹放置在(%d,%d),消灭敌人最多为%d\n",mx,my,maxx);
return ;
}

再解炸弹人,dfs&bfs的更多相关文章

  1. 再解炸弹人——BFS

    原创 之前用了枚举法解炸弹人,题目详情请看我之前的博客:https://www.cnblogs.com/chiweiming/p/9295262.html 利用枚举法是无视地图布局的,枚举法直接全局搜 ...

  2. 三解炸弹人——DFS

    原创 枚举解炸弹人—— https://www.cnblogs.com/chiweiming/p/9295262.html BFS解炸弹人—— https://www.cnblogs.com/chiw ...

  3. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  4. HDU 4414 Finding crosses (DFS + BFS)

    题意:在N*N的图中,找出孤立存在的十字架的个数.十字架要求为正十字,孤立表示组成十字架的‘#的周围的一格再无’#‘. dfs找出在中心的‘#’(周围四格也为‘#'),则缩小了搜索范围,再bfs找出是 ...

  5. ID(dfs+bfs)-hdu-4127-Flood-it!

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...

  6. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  7. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  8. [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)

    695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...

  9. DFS/BFS+思维 HDOJ 5325 Crazy Bobo

    题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...

随机推荐

  1. linux和windows强制用户第一次登陆修改密码

    linux: passwd -e root windows: 计算机右键->管理->本地用户和组->用户->administrator->下一次登陆修改密码 如果密码复杂 ...

  2. SAP Tax Service可以取代TAXBRA / RVABRA吗?(翻译) 跨国贸易云税务解决方案

    这篇文章的内容基于Fausto Motter  的一篇文章,他在SAP社区用葡萄牙语写了一篇文章,讨论如何用云解决方案取代巴西税收计算.我翻译了他的部分文章,添加并修改了一些内容,目标是帮助全球的SA ...

  3. ffmpeg CLI常用命令

    使用-copy参数:  CLI压缩视频时保持音频不变

  4. 可视化展示attention(seq2seq with attention in tensorflow)

    目前实现了基于tensorflow的支持的带attention的seq2seq.基于tf 1.0官网contrib路径下seq2seq 由于后续版本不再支持attention,迁移到melt并做了进一 ...

  5. POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值

    一.excel公共样式类(包含数据科学计数法转为普通值) package com.thinkgem.jeesite.common.utils.excel; import org.apache.poi. ...

  6. numpy和tensorflow中的广播机制

    广播的引出 numpy两个数组的相加.相减以及相乘都是对应元素之间的操作. import numpy as np x = np.array([[2,2,3],[1,2,3]]) y = np.arra ...

  7. 排序算法--插入排序(Insertion Sort)_C#程序实现

    排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...

  8. 关于4A网络安全管控平台控件加载失败的解决方法

    最近电脑重装系统后,到公司登录4A管控平台提示"控件加载失败","无效的参数为:Null","点击资源无任何反映"等等问题 别人的电脑用的好 ...

  9. 【CF666C】Codeword 结论题+暴力

    [CF666C]Codeword 题意:一开始有一个字符串s,有m个事件,每个事件形如: 1.用一个新的字符串t来替换s2.给出n,问有多少个长度为n的小写字母组成的字符串满足包含s作为其一个子序列? ...

  10. python开发工具

    要用到爬虫,网上推荐crapy,自己在pycharm上没有安装成功,于是使用anaconda,但是在gui界面安装crapy总是失败,且没有提示信息.于是使用命令行的方式,提示PermissionEr ...