再解炸弹人,dfs&bfs
输入样例:
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的更多相关文章
- 再解炸弹人——BFS
原创 之前用了枚举法解炸弹人,题目详情请看我之前的博客:https://www.cnblogs.com/chiweiming/p/9295262.html 利用枚举法是无视地图布局的,枚举法直接全局搜 ...
- 三解炸弹人——DFS
原创 枚举解炸弹人—— https://www.cnblogs.com/chiweiming/p/9295262.html BFS解炸弹人—— https://www.cnblogs.com/chiw ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- HDU 4414 Finding crosses (DFS + BFS)
题意:在N*N的图中,找出孤立存在的十字架的个数.十字架要求为正十字,孤立表示组成十字架的‘#的周围的一格再无’#‘. dfs找出在中心的‘#’(周围四格也为‘#'),则缩小了搜索范围,再bfs找出是 ...
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- HDU 4771 (DFS+BFS)
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
随机推荐
- ubuntu Ros环境halcon的一个程序
这个首先并不是我一边做实验一遍记录的,而是我做完成以后才想起来做个分享的,所以中途遇到的很多问题,并没有来得及记录下来,现在写的这些都是后话了 首先呢!我们不需要在ROS下写halcon的程序也是可以 ...
- [原创]Fashion汽车定位器拆解
随着共享单车的爆发增长,定位方案被彻底激活.当下主流的共享单车都采用了MTK2503的方案(后续再详细分解),本文针对某商城热卖的汽车定位器进行拆解分析. 第一部分,定位器外观. 第二部分,拆解开壳, ...
- PHP下载远程图片的3个方法
From: http://blog.csdn.net/iefreer/article/details/46930239 直接上代码 <?php function dlfile1($file_ur ...
- 复制id_rsa命令
pbcopy < ~/.ssh/id_rsa.pub https://aliasan-conf.taijiankong.cn/duotai/2T7b253i8.pac
- 深度学习中交叉熵和KL散度和最大似然估计之间的关系
机器学习的面试题中经常会被问到交叉熵(cross entropy)和最大似然估计(MLE)或者KL散度有什么关系,查了一些资料发现优化这3个东西其实是等价的. 熵和交叉熵 提到交叉熵就需要了解下信息论 ...
- Linux下常见命令
=============挂载和登陆命令======================================== Mount:挂载命令. 比方挂载光驱mount /dev/cdrom /mnt ...
- 垃圾wps弹出,现在连关闭按钮都不给了
垃圾wps弹出,现在连关闭按钮都不给了,有点起色就变得相当垃圾.
- VxWorks信号量问题
VxWorks主要提供如下API进行信号量的创建.获取和释放: 参数1:SEM_Q_PRIORITY,SEM_Q_FIFO SEM_Q_PRIORITY(值为0x1):需要获取该信号量的任务基于优 ...
- sublime 安装ctags跳转以及跳转快捷键
在source insight中有一个很好用的功能,就是函数的跟踪跳转,在阅读别人的代码的时候轻松的浏览原函数.我们知道,在使用vim的时候有个插件叫ctags,同理,在sublime text中也能 ...
- 1 主机WiFi连接下与虚拟机通信问题
环境: 主机:win10系统 虚拟机软件:VMware 虚拟机:winserver 2012 R2 datacenter (数据中心版) 网络上有很多方法说设置NAT模式,并不好用,主机如果用网线连接 ...