大胖子走迷宫【spfa跑状态】【到这个点,并且这个胖 = max(到这个点,按照时间变的这个胖)
大胖子走迷宫
题意

思路
普通的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(到这个点,按照时间变的这个胖)的更多相关文章
- LeetCode 79,这道走迷宫问题为什么不能用宽搜呢?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第48篇文章,我们一起来看看LeetCode当中的第79题,搜索单词(Word Search). 这一题官方给的难 ...
- C语言动态走迷宫
曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...
- BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )
数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...
- NYOJ306 走迷宫(dfs+二分搜索)
题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...
- 洛谷P1238 走迷宫题解
题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示 ...
- Applese走迷宫-bfs
链接:https://ac.nowcoder.com/acm/contest/330/C来源:牛客网 题目描述 精通程序设计的 Applese 双写了一个游戏. 在这个游戏中,它被困在了一个 n×mn ...
- 用Q-learning算法实现自动走迷宫机器人
项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...
- BNUOJ 1055 走迷宫2
走迷宫2 Time Limit: 1000ms Memory Limit: 65535KB 64-bit integer IO format: %lld Java class name: ...
- 数据结构之 栈与队列--- 走迷宫(深度搜索dfs)
走迷宫 Time Limit: 1000MS Memory limit: 65536K 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方 ...
- SDOI2012 走迷宫
走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...
随机推荐
- mysql数据增量及备份操作
注:当数据库出现异常的时候,我们可以先恢复最近一次的全量备份,接着将增量备份的文件一个一个按顺序恢复即可实现原来数据库的恢复. 还可以使用innobackupex 备份工具. 备份 # 1,开启 bi ...
- spring mvc基本介绍
1 MVC 盖帘: MVC 是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计编写 Web 应用程序表现层的模式. MVC 设计模式的三大角色: Model ...
- conda出现Solving environment: failed错误
conda在使用create新建环境和install安装时报错"Solving environment: failed" 报错截图 解决方案 1.在cmd中输入 %HOMEPAT ...
- 大规模人脸分类—allgather操作(1)
pytorch中 all_gather 操作是不进行梯度回传的.在计算图构建中如果需要经过all_gather操作后,仍需要将梯度回传给各个进程中的allgather前的对应变量,则需要重新继承to ...
- Python 封装cmd 执行命令
1.利用shell中执行成功返回0 失败非零 封装成函数 # coding: utf-8 from subprocess import Popen, PIPE, STDOUT import sys ...
- 合并B站video.m4s和audio.m4s
ffmpeg -i D:\a\video.m4s -i D:\a\audio.m4s -codec copy D:\a\a.mp4
- CCF 201803-4 棋局评估
一. 对抗搜索的适用范围 在博弈论题目中,如果决策双方的获胜条件是截然相反的,即一方要求得分越高越好,另一方要求得分越低越好,这时我们就可以用上对抗搜索算法. 二.对抗搜索的主要思想 对抗搜索的核心思 ...
- 初探AOP
1.背景介绍 1.什么是AOP 1)在OOP(面向对象编程)中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加. 2)AOP则将封装好的对象剖开,找出其中对多个 ...
- 【BOOK】解析库--Beautiful Soup
1.安装bs4库 2.解析器 3.节点选择器 from bs4 import BeautifulSoup html = ''' <html> <head><title&g ...
- 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1000),请问能否通过删除SS中的字符(不改变顺序)将它变换成TS,如果可以输出“YES",不可以则输出“NO"。 输入说明:第一行为源字符串SS,第二行为目标字符串TS。
import java.util.Scanner;/* 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1 ...