大胖子走迷宫

题意

思路

普通的bfs走迷宫,多加了一个熟悉,就是胖的圈数。可以来回走,普通的bfs可能不太好处理,我们把这些状态放进spfa跑。

状态定义为{x,y,fat}:坐标位置,胖的圈数。

在状态转移时,因为可以原地走,所以共有5个方向。

接下来考虑,状态转移时花费的距离

  • 要考虑是不是原地走,是不是要加1
  • 要考虑fat维度(由胖到瘦花费的距离)
    • 由胖到瘦花费的距离是固定的。
    • 我们想求出转移到的状态的距离,要记得和上面的取个max。
  • 总之:到达这个点,并且还是这么“胖”的花费 = max(到达这个点的花费,变的这么胖的花费)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define mst(s,_s) memset(s, _s, sizeof(s))
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int N = 1e3+100;
int T,n,m;
char g[N][N];
int st[N][N][3];
int dis[N][N][3];
struct node{
int x,y,fat;
};
int dx[5]={-1,0,1,0,0},dy[5]={0,1,0,-1,0};
bool judge(int x, int y, int z)
{
for(int i = x - z; i <= x + z; i ++)
{
if(i < 1 or i > n) return false;
for(int j = y - z; j <= y + z; j ++)
{
if(j < 1 or j > n) return false;
if(g[i][j] == '*') return false;
}
}
return true;
}
int spfa()
{
memset(dis,0x3f,sizeof dis);
dis[3][3][2]=0;
queue<node>q;
q.push({3,3,2});
st[3][3][2]=1;
while(q.size())
{
auto t=q.front();
q.pop();
int x=t.x,y=t.y,z=t.fat;
st[x][y][z]=0;
for(int i=0;i<5;i++)
{
int a=x+dx[i];
int b=y+dy[i];
int c=z; int dist=(i!=4) + dis[x][y][z];
while(c>=0)
{ dist=max(dist,(2-c)*m+1);
if(judge(a,b,c))
if(dist<dis[a][b][c])
{
dis[a][b][c]=dist;
if(!st[a][b][c]) {
q.push({a,b,c});
st[a][b][c]=1;
} }
c--; }
} }
int res=0x3f3f3f3f;
for(int i=0;i<=2;i++) res=min(res,dis[n-2][n-2][i]);
return res;
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>g[i]+1; cout<<spfa()<<endl; return 0;
}

大胖子走迷宫【spfa跑状态】【到这个点,并且这个胖 = max(到这个点,按照时间变的这个胖)的更多相关文章

  1. LeetCode 79,这道走迷宫问题为什么不能用宽搜呢?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第48篇文章,我们一起来看看LeetCode当中的第79题,搜索单词(Word Search). 这一题官方给的难 ...

  2. C语言动态走迷宫

    曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...

  3. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

  4. NYOJ306 走迷宫(dfs+二分搜索)

    题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...

  5. 洛谷P1238 走迷宫题解

    题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示 ...

  6. Applese走迷宫-bfs

    链接:https://ac.nowcoder.com/acm/contest/330/C来源:牛客网 题目描述 精通程序设计的 Applese 双写了一个游戏. 在这个游戏中,它被困在了一个 n×mn ...

  7. 用Q-learning算法实现自动走迷宫机器人

    项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...

  8. BNUOJ 1055 走迷宫2

    走迷宫2 Time Limit: 1000ms Memory Limit: 65535KB   64-bit integer IO format: %lld      Java class name: ...

  9. 数据结构之 栈与队列--- 走迷宫(深度搜索dfs)

    走迷宫 Time Limit: 1000MS Memory limit: 65536K 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方 ...

  10. SDOI2012 走迷宫

    走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...

随机推荐

  1. onnxruntime源码解析之C接口实现

    onnxruntime的C接口,位置为include/onnxruntime/core/session/onnxruntime_c_api.h. 上述文件包含了C函数的声明,对应的实现在onnxrun ...

  2. 玩玩 Visual Studio Code 和 MSYS2

    注意:为了便于理解本文内容,您可能需要一些前置知识,例如命令行操作,编译器操作,路径操作,环境变量操作,vscode操作-- 众所周知 Visual Studio Code 是一个优秀的编辑器. 众所 ...

  3. HFS~HTTP File Server 2.4rc2 20191231

    后台,打卡,这有的 电脑 PC   浏览器 打开 安卓平台,浏览器,打开,界面

  4. nginx配置根据url的参数值进行转发

    server { listen 8081; location / { set $tag ""; set $cs "/index/test/test"; prox ...

  5. 在VSCODE的终端运行Python时汉字乱码问题处理

    问题描述 在VSCODE的终端运行Python时,打印输出中文时汉字出现乱码, 文件编码都是UTF-8 解决步骤 1.打开Settings配置窗口(Ctrl+,) 2.搜索:code-runner.e ...

  6. c语言学习--静态函数

    静态函数 #include<stdio.h> //这是静态函数, 静态函数只能在当前文件调用,其他文件下面的函数是没法调用到这个函数的 static void fun1() { print ...

  7. [AGC043B] 123 Triangle

    个人思路: 首先,经过 \(1\) 轮就没有 \(3\) 了. 先考虑能否递推前 \(i\) 个数的答案,发现不行. 再考虑能否推出 \(i\) 个数的答案的计算公式,也发现不行. 然后就不会了. 正 ...

  8. java面经学习002

    2. Java都有哪些map,分别怎么实现的,具体讲 3. 除了LinkedHashMap,你还知道哪些有序map 4. ConcurrentHashMap讲一讲 5. 为什么要有线程池 6. 线程池 ...

  9. Linux下Jenkins的安装和启动(war包)

    1.下载Jenkins war包 Jenkins jar 下载 或者使用在线地址下载如下 wget http://mirrors.jenkins-ci.org/war/latest/jenkins.w ...

  10. element 的Descriptions 描述列表固定宽度

    在el-descriptions-item上添加label-class-name="" css中使用自定义的class名设置样式(不能用<style scoped>包裹 ...