输入样例:

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. Windows 10下安装配置Caffe并支持GPU加速(修改版)

    基本环境 建议严格按照版本来 - Windows 10 - Visual Studio 2013 - Matlab R2016b - Anaconda - CUDA 8.0.44 - cuDNN v4 ...

  2. 消息中间件系列二:RabbitMQ入门(基本概念、RabbitMQ的安装和运行)

    一.基本概念 1. AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议.支持不同语言和不同的产品 2. 生产者 ...

  3. SFTP工具类

    1.SFTP搭建方法: 地址: http://www.jb51.net/article/101405.htm https://blog.csdn.net/helloloser/article/deta ...

  4. 蜕变成蝶~Linux设备驱动中的并发控制

    并发和竞争发生在两类体系中: 对称多处理器(SMP)的多个CPU 内核可抢占的单CPU系统 访问共享资源的代码区域称为临界区(critical sections),临界区需要以某种互斥机制加以保护.在 ...

  5. Windows10 + IntelliJ IDEA 2017.3.2 + wamp2e + xdebug 调试 配置

    一.环境 系统: windows10 WampServer:  wampserver2.2e-php5.3.13-httpd2.2.22-mysql5.5.24-32b.exe IDE:  Intel ...

  6. 全局解释器锁GIL

    我们使用高并发,一次是创建1万个线程去修改一个数并打印结果看现象: from threading import Thread import os def func(args): global n n ...

  7. 1.11 flask

    2019-1-11 16:14:34 还有一天flask剩下的就是爬虫了! 越努力,越幸运!永远不要高估自己! 别人玩,你在默默努力!上帝不会亏待你的! Flask-SQLAlchemy参考连接 ht ...

  8. windows 下安装 mongodb 时间太久,卡在那里不动

    1.mongodb官网下载:http://www.mongodb.org/downloads 2.双击程序安装,会出现如下,卡着不动,时间太久,也取消不了 3.是因为安装时默认勾选 compass 图 ...

  9. 已知两点的经度和纬度,计算两点间的距离(php,javascript)

    php代码:转载 http://www.cnblogs.com/caichenghui/p/5977431.html /** * 求两个已知经纬度之间的距离,单位为米 * * @param lng1 ...

  10. 防止vue文件中的样式出现‘污染’情况(html5 scoped特性)

    近期在项目中出现了vue样式污染的情况: 一个页面刚进去时样式不正常,刷新之后,样式才才达到预期那样 在vue中,如果把样式写在vue文件的 style中,可能会出现样式污染的情况,这是要把写样式的标 ...