dfs带状态改变的做法
所谓带状态改变是指:在搜索到某个位置的时候,状态发生改变,继续计算步数。
给一个例题:
蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家。花椰妹告诉他:“你家的钥匙被我复制了很多个,分别放在不同的地方。”
蒜头君希望能尽快回到家中,他需要首先取得任意一把钥匙,请你帮他计算出回家所需要的最短路程。
蒜头君生活的城市可以看做是一个 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带状态改变的做法的更多相关文章
- jQuery 使用 jQuery UI 部件工厂编写带状态的插件(翻译)
首先,我们要创建一个progress bar,它只允许我们简单的设置进度值.正如我们接下来将要看到的,我们需要通过调用 jQuery.widget 及其两个参数来实现这一操作,这两个参数分别是:将要创 ...
- LwIP:处理链路状态改变
[文/告别年代 Email:byeyear@hotmail.com] 重大修订记录 ----------------------------------------- 2016.11.03 感谢@ ...
- 微信小程序开发——列表分页上拉加载封装实现(订单列表为例,订单状态改变后刷新列表滚动位置不变)
业务需求: 业务需求是给订单列表添加分页功能,也就是上拉加载这种每次只请求加载固定数量的数据. 需求分析: 对业务来说就是简单的分页上拉加载,但是对于技术实现来说,除了要处理分页数据的累加加载,还要处 ...
- iOS:使用代理模式监听开关状态改变事件
记一次解决跨控制器监听开关状态改变的尝试. 为了统一设置UITableViewCell里的内容,自定义了UITableViewCell类的一个基类,命名为SettingCell.SettingCell ...
- stat file 查看文件的 最新的被访问时间 最近的修改时间 最近的状态改变时间
[root@NB ~]# stat /media/6FE5-D831/git-data/IT-DOC/web收藏.txt File: `/media/6FE5-D831/git-data/IT-DOC ...
- Spark系列(六)Master注册机制和状态改变机制
各组件的注册流程如下图: 注册机制源码说明: 入口:org.apache.spark.deploy.master文件下的receiveWithLogging方法中的case RegisterAppli ...
- javascript 中状态改变触发事件
转 有限状态机:是一个非常有用的模型,可以模拟世界上大部分事物. 它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. * 某种条件下,会从一种状态转变(trans ...
- 带状态论文粗读(三)[引用openstate的相关论文阅读]
一 文章名称:FLOWGUARD: Building Robust Firewalls for Software-Defined Networks 发表时间:2014 期刊来源:--- 解决问题: 一 ...
- Spark Streaming带状态更新
带状态的更新是使用的updateStateByKey方法,里面传入一个函数,函数要自己写,注意需要设置checkpoint import org.apache.spark.streaming.kafk ...
随机推荐
- split-array-largest-sum(参考了discuss)
注意,第一种用法,涉及到一些Java的知识.就是采用Object作为HashMap的key的时候,需要重载这个Class的 equals 和 hashCode 这两个方法.其中equals需要判断一下 ...
- 附1 consul常用命令+常用选项
之后每用到一个command或options,都会记录在这里. 常用命令command: agent 作用:运行一个consul agent join 作用:将agent加入到consul clust ...
- go语言基础之字符串类型 和 字符与字符串类型的区别
1.字符串类型 示例1: package main //必须有一个main包 import "fmt" func main() { var str1 string str1 = & ...
- django 实现上传文件功能
需求:自己写一个文件上传功能 代码: urls.py from django.conf.urls import url from django.contrib import admin from ap ...
- 给出a的定义 -- 指针 和 数组
- JS实现的MAP结构数据
Array.prototype.remove = function(s) { for (var i = 0; i < this.length; i++) { if (s == this[i]) ...
- [Algorithm] Array production problem
Given an array of integers, return a new array such that each element at index i of the new array is ...
- [Compose] 9. Delay Evaluation with LazyBox
We rewrite the Box example using lazy evaulation. Here is Box example: const Box = (x) => ({ map: ...
- 【转】如何成为Python高手
http://www.aqee.net/how-to-become-a-proficient-python-programmer/ 这篇文章主要是对我收集的一些文章的摘要.因为已经有很多比我有才华的人 ...
- Unity3D随意截图并保存
http://blog.csdn.net/awnuxcvbn/article/details/9199245 效果 代码 <pre name="code" class=&qu ...