大胖子走迷宫

题意

思路

普通的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. laravel常用集合的使用

    创建集合: //数组1 $connection = collect([ ['name'=>'jack','age'=>'18','email'=>'ceshi@qq.com'], [ ...

  2. C语言代码格式脚本-astyle

    安装astyle sudo apt install astyle 代码格式化脚本 #!/bin/sh # http://astyle.sourceforge.net/astyle.html PARAM ...

  3. android studio 查看工程所有动画资源

  4. Github的.gitignore忽略文件

    Git中有一个非常重要的一个文件-----.gitignore 1.当然如果已经push了怎么办?当然也有解决方法,如下: 有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述 ...

  5. vulnhub:easy_cloudantivirus靶机

    kali:192.168.111.111 靶机:192.168.111.177 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --script=http-enum 192.168. ...

  6. QTreeWidget CSS样式

    QTreeWidget{ font: 13pt "楷体"; color: rgb(26, 202, 255); border:1px solid rgb(170, 170, 127 ...

  7. Java数组之Arrays类讲解

    Arrays类 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作. 查 ...

  8. 杭电oj 数值统计

    Problem Description 统计给定的n个数中,负数.零和正数的个数.   Input 输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然 ...

  9. Cimage类处理图像像素(数据)的3种方式(转)

    这里只讨论对图像像素的处理,cimage类的具体用法查相关资料#include <atlimage.h>   //VS2010以后不用加这个 --------CImage  m_Image ...

  10. Docker学习——Dockerfile 指令详解(五)

    我们已经介绍了 FROM (指定基础镜像) , RUN(执行命令) ,还提及了 COPY , ADD ,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COP ...