大胖子走迷宫

题意

思路

普通的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. linux系统安装谷歌浏览器设置开机自动启动并打开指定页面

      要在Linux系统上安装Google Chrome浏览器,可以按照以下步骤: 下载Google Chrome浏览器的安装包,你可以从Google的官方网站或者第三方下载站点上获取. 解压缩安装包并 ...

  2. 简单友好的 Python 任务调度库

    schedule :https://github.com/dbader/schedule 该项目人性化的 API 设计,让开发者仅用几行代码就能轻松实现定时任务.它不依赖任何第三方库,全部代码也就一个 ...

  3. git如何把master合并到自己分支

    1.切换到主分支 git checkout master 2.使用git pull把master代码拉到本地 git pull 3.切换到自己的分支-->(XXX) git checkout X ...

  4. SAP物料状态

    物料状态控制当前物料是否可以生产.采购.设计等功能 设置路径:spro-->后勤常规-->物料主数据-->设置关键字段-->定义物料状态

  5. Netty Reactor模型

    1.netty抽象出两个线程池:BossGroup负责监听和建立连接 :WorkerGroup 负责网络IO的读写 2.BossGroup 和 WorkerGroup 类型都是NioEventLoop ...

  6. tomcat8 无法解析 请求url 中 包含 [: 或者 :] 等特殊符号

    使用如下URL: http://127.0.0.1:8080/xx/[:xOGxeSSk5ENaYh89ziEFJA==:].do 如果使用tomcat8 无法正常访问,浏览器network 报错 4 ...

  7. HTML弹窗设计二

    <!DOCTYPE html><html> <head> <title>模态框弹出层.html</title> <meta http- ...

  8. 原创:USB HID读卡器数据解析(R321-13.56MHZ读卡器)

    1.工具准备 USB 监视软件:Device Monitoring Studio7.25 PC端软件:单片机多功能调试助手 2.发送数据包 接收数据包 3.数据分析 usb hid(pc软件)发送帧( ...

  9. R8051_simulation

    1 下载 git clone https://github.com/risclite/R8051.git 2 编辑文件 mkdir work && mv sim tb flist .. ...

  10. Day 22 22.1.2:增量式爬虫 - 场景2的实现

    场景2的实现: 数据指纹 使用详情页的url充当数据指纹即可. 创建爬虫爬虫文件: cd project_name(进入项目目录) scrapy genspider 爬虫文件的名称(自定义一个名字即可 ...