68-蒜头君回家

2023-10-06 14:19
文章标签 68 蒜头 回家

本文主要是介绍68-蒜头君回家,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

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

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

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

输入格式

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

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

输出格式

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

样例输入
8 10
P.####.#P#
..#..#...#
..#T##.#.#
..........
..##.#####
..........
#####...##
###....S##
样例输出
21

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

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

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


代码解析:

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


这篇关于68-蒜头君回家的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/153259

相关文章

nyoj 1072 我想回家

一道相当题目描述相当扯的题。 这道题目的描述最后说的是求出到达最后一个点的最短距离,所以输入数据最后输入的城堡的坐标是没用的。 就是先求出两点之间的距离,若不大于村落间距离,并且不大于最后的距离限制 l ,则在两点间建边。 最后任意方法求出最短路即可。 #include <iostream>#include<stdio.h>#include<vector>#include<

68-java字符流和字节流

Java中的字符流和字节流是用于处理输入/输出的两大类。字符流主要用于处理字符数据,而字节流可以处理任何类型的数据。 字符流: Reader:用于读取字符流的抽象类。 Writer:用于写入字符流的抽象类。 字节流: InputStream:用于读取字节流的抽象类。 OutputStream:用于写入字节流的抽象类。 下面是使用字符流和字节流的简单示例: 字符流示例(文件复

LeetCode 68 Text Justification

题意: 给出许多单词和一行能显示的最大长度,将所有单词按照两端对齐的方式进行排版,最后一行左对齐并用空格补齐长度。 思路: 一行一行的排版,每一行检查最多能放几个单词,即先假设单词之间只用1个空格分隔。 确定了一行要显示的单词数后,判断是否为最后一行,如果是,那么单词间用1个空格分隔,最后补空格到行最大长度;若不是最后一行,则每个单词后跟几个空格需要计算,计算方法见代码19和20行。

面试礼仪 + 5.1回家必带+大学结束感悟

回家必带的: 身份证        采集信息        实习协议     学生证 要买的: 上衣衬衫, 脚部急眼, 教师证现场确认资料:正在准备启闭,下次回家太晚直接去报名 书(EQ太低了) -------------------------------- 回学校答辩4.28号 1: 还是的交流:很多信息不知道, 如答辩步骤,上传最新版论文,。。。。 5月8号成都信息工程

力扣68.文本左右对齐

import java.util.ArrayList;import java.util.List;class Solution {public List<String> fullJustify(String[] words, int maxWidth) {List<String> result = new ArrayList<>(); // 创建一个列表用于存储结果int index = 0;

LeetCode题66~68: 二叉树的遍历

1. 题目描述: 给出一棵二叉树,返回其节点值的前序遍历、中序遍历、后序遍历。 例如: 4 / \ 2 6 / \ / \ 1 3 5 7 前序遍历(根—左—右):4, 2, 1, 3, 6, 5, 7 中序遍历(左—根—右):1, 2, 3, 4, 5, 6, 7 后序遍历(左—右—根):1, 3, 2, 5, 7, 6, 4 2. 二叉树的数据结构: struct Tr

68 H3C SecPath F1000 (系统模块介绍-1)

68 H3C SecPath F1000 (系统模块介绍) 01-高可靠性 特性简介 高可靠性(High Availability),简称为HA,能够在通信线路或设备产生故障时提供备用方案,当其中一个网络节点发生故障时,另一个网络节点可以接替故障节点继续工作。 HA通过RBM(Remote Backup Management,远端备份管理)协议管理多个VRRP备份组状态的统一切换或者调整动

leetcode_68. 文本左右对齐

68. 文本左右对齐 题目描述:给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' ' 填充,使得每行恰好有 maxWidth 个字符。 要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不

【教学类65-02】20240622秘密花园涂色书02(通义万相)(A4横版2张,一大 68张纸136份)

背景需求 【教学类65-01】20240622秘密花园涂色书01(通义万相)(A4横版2张,一大3小 38张纸76份)-CSDN博客文章浏览阅读118次。【教学类65-01】20240622秘密花园涂色书01(通义万相)(A4横版2张,一大3小 38张纸76份)https://blog.csdn.net/reasonsummer/article/details/139899797 以上

68. Text Justification

https://leetcode.com/problems/text-justification/description/ 给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ’ ’ 填充,使得每行恰好有 maxWidth