所谓带状态改变是指:在搜索到某个位置的时候,状态发生改变,继续计算步数。

给一个例题:

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

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

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

输入格式

第一行有三个整数 nn,mm。城市的地图是 nn行 mm 列。(1 \leq n,m \leq 20001≤n,m≤2000)

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

输出格式

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

样例输入

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

样例输出

21

当拿到钥匙后,进入找家的状态,,,

方法:增加一个维度,用来记录处于哪个状态。
#include<bits/stdc++.h>
using namespace std;
char mat[][];
bool vis[][][];
int dx[]={,-,,};
int dy[]={,,,-};
int n,m;
struct Node
{
int x,y;
int sta;
int step;
};
int bfs(Node s)
{
queue<Node> q;
while(!q.empty()) q.pop();
q.push(s);
while(!q.empty())
{
Node now=q.front();
if(now.sta==&&mat[now.x][now.y]=='T') return now.step;
q.pop();
int nx,ny;
//cout<<now.x<<" "<<now.y<<endl;
for(int i=;i<;i++)
{
nx=now.x+dx[i];
ny=now.y+dy[i];
if(nx>=&&nx<n&&ny>=&&ny<m)
{
if(!vis[now.sta][nx][ny]&&mat[nx][ny]!='#')
{
Node next;
next.x=nx;
next.y=ny;
next.step=now.step+;
if(mat[nx][ny]=='P'||now.sta==)
{
next.sta=;
}
else
{
next.sta=;
}
vis[next.sta][nx][ny]=;
q.push(next);
}
}
} }
}
int main()
{ cin>>n>>m;
for(int i=;i<n;i++)
{
scanf("%s",mat[i]);
}
Node s;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if(mat[i][j]=='S')
{
s.x=i;
s.y=j;
s.sta=;
s.step=;
}
}
}
memset(vis,,sizeof(vis));
cout<<bfs(s)<<endl;
return ; }

dfs带状态改变的做法的更多相关文章

  1. jQuery 使用 jQuery UI 部件工厂编写带状态的插件(翻译)

    首先,我们要创建一个progress bar,它只允许我们简单的设置进度值.正如我们接下来将要看到的,我们需要通过调用 jQuery.widget 及其两个参数来实现这一操作,这两个参数分别是:将要创 ...

  2. LwIP:处理链路状态改变

    [文/告别年代   Email:byeyear@hotmail.com] 重大修订记录 ----------------------------------------- 2016.11.03 感谢@ ...

  3. 微信小程序开发——列表分页上拉加载封装实现(订单列表为例,订单状态改变后刷新列表滚动位置不变)

    业务需求: 业务需求是给订单列表添加分页功能,也就是上拉加载这种每次只请求加载固定数量的数据. 需求分析: 对业务来说就是简单的分页上拉加载,但是对于技术实现来说,除了要处理分页数据的累加加载,还要处 ...

  4. iOS:使用代理模式监听开关状态改变事件

    记一次解决跨控制器监听开关状态改变的尝试. 为了统一设置UITableViewCell里的内容,自定义了UITableViewCell类的一个基类,命名为SettingCell.SettingCell ...

  5. stat file 查看文件的 最新的被访问时间 最近的修改时间 最近的状态改变时间

    [root@NB ~]# stat /media/6FE5-D831/git-data/IT-DOC/web收藏.txt File: `/media/6FE5-D831/git-data/IT-DOC ...

  6. Spark系列(六)Master注册机制和状态改变机制

    各组件的注册流程如下图: 注册机制源码说明: 入口:org.apache.spark.deploy.master文件下的receiveWithLogging方法中的case RegisterAppli ...

  7. javascript 中状态改变触发事件

    转 有限状态机:是一个非常有用的模型,可以模拟世界上大部分事物. 它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. * 某种条件下,会从一种状态转变(trans ...

  8. 带状态论文粗读(三)[引用openstate的相关论文阅读]

    一 文章名称:FLOWGUARD: Building Robust Firewalls for Software-Defined Networks 发表时间:2014 期刊来源:--- 解决问题: 一 ...

  9. Spark Streaming带状态更新

    带状态的更新是使用的updateStateByKey方法,里面传入一个函数,函数要自己写,注意需要设置checkpoint import org.apache.spark.streaming.kafk ...

随机推荐

  1. longest-palindrome

    https://leetcode.com/problems/longest-palindrome/ public class Solution { public int longestPalindro ...

  2. 通过nc构造telnet后门

    nc被称为网络中的“瑞士军刀”,其功能强大,如果在肉鸡上运行“nc.exe –p port –L –d –e cmd.exe”命令就可以构建一个telnet后门,即使关闭了nc.exe程序运行窗口,该 ...

  3. MySQL服务器安装完之后如何调节性能

    原文作者: Peter Zaitsev原文来源: http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server ...

  4. 【Python】Django CSRF问题

    参考资料: Django Ajax CSRF 认证:http://www.ziqiangxuetang.com/django/django-csrf.html Python Post遇到csrftok ...

  5. 水晶报表WEB方式下不打印的问题

    水晶报表版本是10.2.3600.0,是vs2005自带的.功能原来正常,服务器重做后不能打印,但是导出功能正常. 研究的大概情况: 1.水晶报表的web相关代码位于\aspnet_client\sy ...

  6. strcpy与strncpy

    char aa[]="123456789123456789123456789"; char bb[4]={0}; 1.strcpy(bb,aa); bb的空间,不能存下aa的内容, ...

  7. windows下安装msysgit 及ruby

    一:安装msysgit git是目前最流行的软件版本控制软件,在window下通常使用msysgit 下载:http://msysgit.github.io/ 安装:基本上一路默认下一步就行 安装之后 ...

  8. FLV视频播放:对未缓冲进度条实现拖动

    FLV视频播放:对未缓冲进度条实现拖动  流媒体开发 Add comments 八282010 一.文件准备 1.转码:ffmpeg 2.添加元数据:yamdi 二.网页播放器:jw player 使 ...

  9. sublime text 全局搜索快捷键

    sublime text 全局搜索快捷键 ctrl+shift+F

  10. java在线预览txt、word、ppt、execel,pdf代码

    在页面上显示各种文档中的内容.在servlet中的逻辑 word: BufferedInputStream bis = null; URL url = null; HttpURLConnection ...