计蒜客-蒜头君回家(bfs)

2023-05-16

蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家。花椰妹告诉他:“你家的钥匙被我复制了很多个,分别放在不同的地方。”

蒜头君希望能尽快回到家中,他需要首先取得任意一把钥匙,请你帮他计算出回家所需要的最短路程。

蒜头君生活的城市可以看做是一个 n×m 的网格,其中有道路有障碍,钥匙和家所在的地方可以看做是道路,可以通过。蒜头君可以在城市中沿着上下左右 4 个方向移动,移动一个格子算做走一步。

输入格式

第一行有两个整数 n,m。城市的地图是 n 行 m 列。(1≤n,m≤2000)

接下来的 n 行,每行 m 个字符,代表城市的地图。’.’ 代表道路,’#’ 代表障碍物,’S’ 代表蒜头君所在的位置,’T’ 代表蒜头家的位置,’P’代表钥匙的位置。除了障碍物以外,别的地方都可以通过。(题目保证蒜头君至少有一条路径可以顺利拿到钥匙并且回家)

输出格式

输出蒜头回家要走的最少步数,占一行。

样例输入

8 10
P.####.#P#
..#..#...#
..#T##.#.#
..........
..##.#####
..........
#####...##
###....S##

样例输出

21

解题说明:这里我们并不是先搜索所有钥匙,再从每个每个钥匙出发找终点,这样肯定会超时。

我们就搜一次,真的就一次!搜索的过程中,找到钥匙的,其后面走过的坐标都记标志,标志说明我已经有钥匙了,没有标识,则经过终点也继续搜。记一个flag不行,不同的路径在搜,可能其中一条找到钥匙了,你变了flag,另外的没有钥匙的到了终点判断到了,就错了。

标志的问题,多加一维,已经有钥匙了有没走过,和没有钥匙的走没走过。

ac代码:

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxl 2010
using namespace std;
int n,m;
int a[maxl][maxl],vist[maxl][maxl][2];
int cg[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct point{
	int x;int y;int foot;int flag;
	point(int xx,int yy,int fot,int f){
		x=xx;y=yy;foot=fot;flag=f;
	}
};
int bfs(int x,int y){
	queue<point>q;
	q.push(point(x,y,0,0));
	vist[x][y][0]=1;
	while(!q.empty()){
		point po=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int tx=po.x+cg[i][0];
			int ty=po.y+cg[i][1];
			if(a[tx][ty]!='#'&&!vist[tx][ty][po.flag]&&tx>0&&tx<=n&&ty>0&&ty<=m){
				vist[tx][ty][po.flag]=1;
				if(a[tx][ty]=='P'){
					q.push(point(tx,ty,po.foot+1,1));
				}
				else if(a[tx][ty]=='T'&&po.flag){
					return po.foot+1;
				}
				
				else q.push(point(tx,ty,po.foot+1,po.flag));
			}
		}
	} 
}
int main(){
	scanf("%d%d",&n,&m);
	memset(vist,0,sizeof(vist));
	int bx,by;
	for(int i=1;i<=n;i++){
		 getchar();
		 for(int j=1;j<=m;j++){
		 	  scanf("%c",&a[i][j]);
		      if(a[i][j]=='S'){
		      	bx=i;by=j;
			  }
		 }
	}	
	printf("%d\n",bfs(bx,by));
	return 0;
}

运行超时代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<map>
#define maxl 2048
using namespace std;
int n,m,ans=0,flag=0;
int a[maxl][maxl],mark[maxl][maxl];long long b[maxl][maxl];
int cgx[4]={1,-1,0,0};
int cgy[4]={0,0,1,-1};
long long mn=100000000000007;
int ex,ey; 
map<int,map<int,int> >mp;
struct point{
	int x;int y;
	point(int xx,int yy){
		x=xx;
		y=yy;
	}
};
struct p{
	int p1;
	int p2;
}pz[maxl*maxl];
void bfs(int x,int y,int index){
    queue<point>q;
    while(!q.empty()){
    	q.pop();
	}
	q.push(point(x,y));
	mark[x][y]=1;
	while(!q.empty()){
		if(index==ans)return ;
		x=q.front().x;
		y=q.front().y;
		q.pop();
		for(int i=0;i<4;i++){
			int tx=x+cgx[i];
			int ty=y+cgy[i];
			if(a[tx][ty]&&!mark[tx][ty]&&tx>0&&tx<=n&&ty>0&&ty<=m){
				  mark[tx][ty]=1;
				  b[tx][ty]=b[x][y]+1;
				  q.push(point(tx,ty));
				  if(a[tx][ty]==2&&!flag){
				  	 mp[tx][ty]=b[tx][ty];
					 index++; 
				  }
				  if(flag&&a[tx][ty]==6){
				  	  return ;
				  }
		    }
	   }	    	
    }
    return ;
}
int main(){
	scanf("%d%d",&n,&m);
	char ip1;int bx,by;
	for(int i=1;i<=n;i++){
		string s;cin>>s;
		for(int j=1;j<=m;j++){
			ip1=s[j-1];
			if(ip1=='S'){
				a[i][j]=1;
				bx=i;by=j;
			}
			else if(ip1=='.')a[i][j]=1;
			else if(ip1=='P'){
				pz[ans].p1=i;pz[ans].p2=j;
				ans++;
				a[i][j]=2;
			}
			else if(ip1=='T'){
				ex=i;ey=j;
				a[i][j]=6;
			} 
			else a[i][j]=0;
		}	
	}
	bfs(bx,by,0);
	for(int i=0;i<ans;i++){
		memset(mark,0,sizeof(mark));
		memset(b,0,sizeof(b));
		if(mp[pz[i].p1][pz[i].p2]){
			 flag=1;
			 bfs(pz[i].p1,pz[i].p2,0);
			 if(b[ex][ey]){
			 	if(mp[pz[i].p1][pz[i].p2]+b[ex][ey]<mn)mn=mp[pz[i].p1][pz[i].p2]+b[ex][ey];
			 }
		}	
	}
	printf("%d\n",mn);
	return 0;
} 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计蒜客-蒜头君回家(bfs) 的相关文章

  • 洛谷 P1825 [USACO11OPEN]Corn Maze S(bfs)

    题目传送 1 这仅仅是一道加了传送门的bfs 2 仅仅加了一个传送门 xff0c 就卡了我一下午 3 门存在不成对的情况 span class token macro property span class token directive
  • bfs之走地图(迷宫)

    题目 xff1a 东东找妹纸 东东手里有一张神奇的地图 xff0c 通过地图可以找到妹子 xff01 地图显示 xff0c 0表示可以走 xff0c 1表示不可以走 xff0c 左上角是入口 xff0c 右下角是妹纸 xff0c 这两个位置
  • P1825 [USACO11OPEN]Corn Maze S 【BFS】

    题目描述 This past fall Farmer John took the cows to visit a corn maze But this wasn t just any corn maze it featured severa
  • c++:DFS与BFS详解

    DFS xff08 深度优先搜索 xff09 xff1a 从某个状态开始 xff0c 不断转移状态到无法转移为止 xff0c 然后退回到前一步 xff0c 继续转移到其他状态 xff0c 不断重复 xff0c 直至找到最终的解 总是从最开始
  • 肿瘤诊断(PAT)

    题目链接 https www patest cn contests gplt L3 004 一道很裸的bfs 一开始以为会超时 抱着试一试的心态交了一发竟然过了 include
  • 拓扑排序(广度优先搜索实现)

    有向无环图可以用来表示各种事物的顺序 比如工作顺序 一些事情必须在另一些事情完成之后才能开始进行 那么 为了获得正确的工作顺序 一件事情开始之前 必须保证它的前置条件全部满足 就需要用到拓扑排序 拓扑排序其实就是在有向无环图中 只要存在边
  • Birdwatching 【Gym - 102501K】

    题目链接 抗疫期间 在家读如此长的题目容易烦躁hh 于是我就帮大伙读了 有N个点 M条边的无向图 我们给出图P是图G的一个衍生图 图G中的点和边图P中都有 但是图P中可能存在一些多余边 怎么说呢 就是图G中有a gt b gt c这样的边
  • 算法和数据结构项目练习7-广度优先搜索(BFS)

    Breadth First Search 项目介绍 代码实现 项目介绍 本项目实现广度优先搜索算法 读取txt文件中第一行表示图中顶点数的单个整数N 读取txt文件中第二行开始是一对对的整数 每一对表示图中某条边两端的两个顶点 图是无向的
  • Olya and Energy Drinks【Codeforces 877D】【BFS+思维+剪枝】

    Codeforces Round 442 Div 2 D 这天给学弟学妹们出了这道题 没想到背锅了 感觉要0A了 QAQ 确实 今天我再次写的时候也WA了好几发 哎 这锅背了 看到有些的代码code 访问过的点都标记为mp x y 但是这样
  • 2019年第十届蓝桥杯省赛A组(C/C++组)迷宫(BFS)

    试题 D 迷宫 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从一个位置走到这 个它
  • uva 1601 The Morning after Halloween

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 bfs 1 先将地图用图的方法表示 即在每一个空白
  • 汽车加油行驶问题【网络流24题】【可以使用BFS】

    题目链接 这道题虽然说是网络流24题中的一题 但是我的第一想法确实去用BFS 跑一个最小的花费 但是由于加油的钱 向后走的钱 开设一个新的加油站的钱是不固定的 所以 我们需要进行相应的判断 跑所有可以达到终点的值去比较大小 include
  • 图的遍历方法——DFS和BFS

    DFS类似于树的先序遍历 因此可以用递归实现 BFS类似于树的层次遍历 因此可以用队列实现 说明 下面代码中图的存储方式是邻接表 关于邻接表和邻接矩阵可看邻接表和邻接矩阵 1 深度优先遍历 Depth First Search 思想 从图中
  • Oil Deposits(BFS)

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits GeoSurvComp works with one
  • Instrusive 【HDU - 5040】【2014 北京 BFS】

    题目链接 一道有着很多需要细节的地方需要注意的题 挺不错的 这题的数据也是给的很好 然后讲一下题意吧 题意 有一个N N的网格 有起点M和终点T 我们从起点需要走到终点 每一步需要花费的时间是单位一 但是呢 我们不能被摄影机拍摄到 摄影机是
  • HDU--1242:Rescue (BFS)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1242 2 易错点 可能存在多个朋友 即多个map 中有多个 r 所以起始点为Angel的位置 最短时间为到达最近的朋友的时间 3 源代码 H
  • 迷宫 蓝桥杯 602

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可以通行的地方 010000 000100 001001 110000 迷宫的入口为左上
  • 第十届蓝桥杯省赛C++B组 迷宫

    试题 E 迷宫 本题总分 15 分 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从
  • 奶酪【BFS】

    题目链接 点从z 0为起点 想跑到z h 只能在球内 或者是球表层上跑 问能否从起点跑到终点 直接暴力bfs判断即可 include
  • 长草(Python)

    题目描述 小明有一块空地 他将这块空地划分为 n 行 m 列的小块 每行和每列的长度都为 1 小明选了其中的一些小块空地 种上了草 其他小块仍然保持是空地 这些草长得很快 每个月 草都会向外长出一些 如果一个小块种了草 则它将向自己的上 下

随机推荐

  • 【低光增强】Zero-DCE

    文章目录 一 前言二 算法理解2 1 低光增强曲线2 2 整体框架2 3 网络结构2 4 损失函数2 4 1 空间一致性2 4 2 曝光控制2 4 3 色彩恒常2 4 4 光照平滑 2 5 Zero DCE 43 43 三 效果测试 一 前
  • 【对比度增强】Learning Tone Curves for Local Image Enhancement(LTMNet)

    文章目录 0 前言1 理解1 1 整体框架1 2 网络结构1 3 细节 2 亮点3 总结 0 前言 LTMNet这篇文章借鉴了CLAHE算法 xff0c 所有步骤与CLAHE一致 xff0c 不同之处在于LTMNet中局部映射曲线是通过CN
  • 【数字图像处理】边缘检测

    文章目录 0 前言1 Sobel算子2 Canny算子3 深度学习算法3 1 Holistically Nested Edge Detection xff08 HED xff09 3 2 Richer Convolutional Featu
  • 语义分割总结

    文章目录 0 前言1 数据集2 经典网络2 1 FCN2 2 U Net2 3 DeepLab2 4 PSPNet2 5 SegNet2 6 CCNet2 7 SegFormer 3 损失函数4 评价指标5 最新进展 xff08 2023
  • 使用matlab绘制世界地图并根据经纬度绘制点位(附m_map的下载与安装说明)

    文章目录 1 worldmap amp geoshow2 m map工具箱3 根据经纬度在世界地图上绘制点位 使用matlab绘制世界地图有两种方法 xff08 自己使用过的 xff0c 可能有别的我不了解的方法 xff09 xff1a 第
  • C 语言使用宏自定义可打印的枚举(enum) 类型

    1 前言 xff1a 说点废话 xff0c 时间紧的请直接跳过 xff0c 看后面的实现 尽管本人很反感 C 语言中的宏定义 xff0c 特别是滥用宏定义经常会让问题变的扑朔迷离 xff0c 但是不得不承认 xff0c 在某些时候 xff0
  • Matlab GUI设计之坐标转换(附Matlab GUI设计学习手册完整版pdf)

    文章目录 如何开始 xff1f 1 界面布局2 编写回调函数 相信看这篇文章的你们大部分没有用Matlab做过界面设计 xff0c 其实不只是你们 xff0c 我也是第一次 xff08 手动滑稽 xff09 xff0c 在此将我的经验同大家
  • 【Linux】线程互斥

    目录 1 进程线程间的互斥相关背景概念 2 互斥量mutex 2 1 基本概念 2 2 售票系统举例 2 3 解释 3 互斥量的接口 3 1 初始化互斥量 3 1 1 静态分配 3 1 2 动态分配 xff08 pthread mutex
  • C语言经典算法(八)——递归实现斐波那契数列的两种方法

    后继续整理算法并写出自己的理解和备注 C 43 43 实现的 xff1a 递归实现斐波那契数列 1 递归实现斐波那契数列Fib n lt 1 gt 题目描述 输入n值 xff0c 求解第n项的斐波那契数列值 lt 2 gt 方法一 概念法
  • 使程序在Linux下后台运行 (关掉终端继续让程序运行的方法)

    你是否遇到过这样的情况 xff1a 从终端软件登录远程的Linux主机 xff0c 将一堆很大的文件压缩为一个 tar gz文件 xff0c 连续压缩了半个小时还没有完成 xff0c 这时 xff0c 突然你断网了 xff0c 你登录不上远
  • Vue+Element-UI上传图片到七牛云踩过的坑——返回 404,报错:Document not found

    文章目录 前端上传图片到七牛云的流程七牛云地址1 常见问题2 分清区别 xff1a 配置区域和访问域名 代码示例 不是进来找报错原因 xff0c 看怎么上传图片的 xff0c 先看上传流程和分清区别 xff1a 配置区域和访问域名找到域名
  • MySQL8.0.3安装过程详细

    xff08 如果以前安装过MySQL先卸载 xff09 一 MySQL卸载 1 以管理员身份打开命令提示符 2 停止MySQL后台服务 MySQL8为自己设置的MySQL服务名 D mysql 8 0 30 winx64 bin gt ne
  • 基于opencv 的人脸签到系统

    import cv2 import os import numpy as np from PIL import Image pillow import pyttsx3 import sys import json def makeDir e
  • LCA算法的实现

    include lt cstdio gt include lt string h gt include lt algorithm gt include lt set gt using namespace std const int MAXN
  • 卷积神经网络原理

    看了一篇通俗易懂的好文章 https brohrer mcknote com zh Hans how machine learning works how convolutional neural networks work html 关于
  • 括号匹配问题(并给出括号的位置)

    在纸上写了一个串 xff0c 只包含 39 39 和 39 39 一个 39 39 能唯一匹配一个 39 39 xff0c 但是一个匹配的 39 39 必须出现在 39 39 之前 请判断蒜头君写的字符串能否括号完全匹配 xff0c 如果能
  • Rust学习入门--【12】Rust 循环

    系列文章目录 Rust 语言是一种高效 可靠的通用高级语言 xff0c 效率可以媲美 C C 43 43 本系列文件记录博主自学Rust的过程 欢迎大家一同学习 Rust学习入门 1 引言 Rust学习入门 2 Rust 开发环境配置 Ru
  • 一年有多少节假日

    日历有 阳历 xff08 公历 xff09 和 阴历 xff08 农历 xff09 之分 每年都有法定节假日 xff0c 这些分成三类 双休 阳历节假日 阴历节假日 双休 1 xff09 周六和周日 2 2 天 阳历节假日 1 xff09
  • 走迷宫(bfs)

    给你一个 n 行 m 列的二维迷宫 39 S 39 表示起点 xff0c 39 T 39 表示终点 xff0c 39 39 表示墙壁 xff0c 39 39 表示平地 你需要从 39 S 39 出发走到 39 T 39 xff0c 每次只能
  • 计蒜客-蒜头君回家(bfs)

    蒜头君要回家 xff0c 但是他家的钥匙在他的朋友花椰妹手里 xff0c 他要先从花椰妹手里取得钥匙才能回到家 花椰妹告诉他 xff1a 你家的钥匙被我复制了很多个 xff0c 分别放在不同的地方 蒜头君希望能尽快回到家中 xff0c 他需