P6474

摘自:
一看题目,像个搜索
再一看,像个广度优先搜索
既然是BFS,那我们首先要搞出一个(一堆)队列
那问题是队列里咱们存啥呢???
首先,按照广搜解决“迷宫问题”的国际惯例,肯定要先把坐标和步数存到里面!
可是,这似乎不大够?
因为荆轲还有两种技能:隐身和瞬移。
隐身:balabala……
瞬移:balabala……
现在给出咸阳城的地图,请计算荆轲到达秦王所在点所需的最短时间。此外,在所用时间相同情况下,荆轲希望使用的两种技能总次数尽可能少;在所用时间与技能次数相同情况下,荆轲希望使用的隐身次数尽可能少。
emmmmm,还要把隐身和瞬移的使用次数存下来~
啊,要存这么多东西……这时候,结构体就要派上用场啦!

struct qwq{int x,y,yx,sy,s;//x,y——对应的坐标//s——走到这一步的步数//yx——隐形使用次数//sy——瞬移使用次数//(都是用拼音写的呢)
};
queue <qwq> q;

当然,我们要在茫茫多的方案中选择一个最优解——所以,我们要写一个函数(算是取min吧……),来选择一个最优解

qwq minq(qwq a,qwq b){if(a.s!=b.s)return a.s<b.s?a:b;//优先选择步数更小的if(a.yx+a.sy!=b.yx+b.sy)return a.yx+a.sy<b.yx+b.sy?a:b;//如果步数相等,选择一个技能使用更少的return a.yx<b.yx?a:b;//都相等?!那就选一个隐身用的更少的吧
}
qwq ans=(qwq){0,0,233333333,233333333,233333333};//顺便把初始化的ans放出来,当然要挑个大的

……

#include<bits/stdc++.h>
using namespace std;
struct qwq{int x,y,yx,sy,s;
};
qwq minq(qwq a,qwq b){if(a.s!=b.s)return a.s<b.s?a:b;if(a.yx+a.sy!=b.yx+b.sy)return a.yx+a.sy<b.yx+b.sy?a:b;return a.yx<b.yx?a:b;
}
bool vis[355][355][20][20],look[355][355];
int tag[355][355];
int n,m,c1,c2,d;
int map[355][355];
const int dx[8]={1,0,-1,0,1,-1,-1,1},dy[8]={0,1,0,-1,1,1,-1,-1};
void lookaround(int x,int y,int k){for(int i=0;i<=k;i++){tag[max(x-i,1)][max(y-(k-i),1)]++; tag[max(x-i,1)][min(y+(k-i),m)+1]--;tag[min(x+i,n)][max(y-(k-i),1)]++;tag[min(x+i,n)][min(y+(k-i),m)+1]--;}
}
int sx,sy,ex,ey;
queue <qwq> q;
qwq ans=(qwq){0,0,233333333,233333333,233333333};
void bfs(){while(!q.empty()){qwq fro=q.front();q.pop();if(fro.s>ans.s)continue;if(fro.x==ex&&fro.y==ey){ans=minq(ans,fro);continue;} for(int i=0;i<8;i++){int nx=fro.x+dx[i];int ny=fro.y+dy[i];if(nx<1||nx>n||ny<1||ny>m||map[nx][ny]>0)continue;if(look[nx][ny]){if(vis[nx][ny][fro.yx+1][fro.sy]||fro.yx+1>c1)continue;vis[nx][ny][fro.yx+1][fro.sy]=1;q.push((qwq){nx,ny,fro.yx+1,fro.sy,fro.s+1});}else{if(vis[nx][ny][fro.yx][fro.sy])continue;vis[nx][ny][fro.yx][fro.sy]=1;q.push((qwq){nx,ny,fro.yx,fro.sy,fro.s+1});				}}if(fro.sy+1>c2)continue;for(int i=0;i<4;i++){int nx=fro.x+dx[i]*d;int ny=fro.y+dy[i]*d;if(nx<1||nx>n||ny<1||ny>m||map[nx][ny]>0)continue;if(look[nx][ny]){if(vis[nx][ny][fro.yx+1][fro.sy+1]||fro.yx+1>c1)continue;vis[nx][ny][fro.yx+1][fro.sy+1]=1;q.push((qwq){nx,ny,fro.yx+1,fro.sy+1,fro.s+1});}else{if(vis[nx][ny][fro.yx][fro.sy+1])continue;vis[nx][ny][fro.yx][fro.sy+1]=1;q.push((qwq){nx,ny,fro.yx,fro.sy+1,fro.s+1});				}			}}
}
int main(){ios::sync_with_stdio(false);cin>>n>>m>>c1>>c2>>d;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){string s;cin>>s;if(s[0]=='S'){sx=i,sy=j;map[i][j]=-1;q.push((qwq){sx,sy,0,0,0});vis[i][j][0][0]=1;}else if(s[0]=='T'){ex=i,ey=j;map[i][j]=-2;}else if(s[0]=='.')map[i][j]=0;else{int x=0;for(int i=0;i<s.size();i++)x=(x<<1)+(x<<3)+(s[i]^'0');map[i][j]=x;lookaround(i,j,x-1);}}}for(int i=1;i<=n;i++){int sum=0;for(int j=1;j<=m;j++){sum+=tag[i][j];	if(sum>0)look[i][j]=1;	}}	bfs();if(ans.s==233333333)printf("-1");else printf("%d %d %d",ans.s,ans.yx,ans.sy);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799507.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法 - 回溯算法1

题目1 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n = 4, k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2: 输入:n = 1, k = 1 输出:[[1]]提示:1 <= n <= 20 1 <= k…

错误

PID自己搭的时候,要注意积分模块的位置,搞不明白好久了,原来是我把积分模块的位置放错了。直接用增益模块不容易出错。

OSG开发笔记(三十):OSG加载动力学仿真K模型文件以及测试Demo

前言Osg需要打开模型文件,但是遇到显示动力学仿真的K模型文件,.k文件是一种描述材料属性的文件,比如密度、弹性模量等,该模型文件不是常规中间开放格式,无法直接支持,需要自定义解析并且重建三维模型。 Demo实际非常流程,因为视频转gif导致部分看起来不行:   交互流畅…

0918高数一千题,多元函数积分学

T17.第一型曲线积分空间形式 用斯托克斯公式化成第二型曲面积分 解第二型曲面积分,用高斯公式或者投影转换法,后者注意正负号,上正下负,前正后负 T18.换路径,但是x=1左半段不能化成lnx算 T19.求偏导就对对应字母求就行,不用对y导x T20.多元极值AC-B2>0A>0,极小 A<…

Dynamic Locomotion in the MIT Cheetah 3 Through Convex Model-Predictive Control

1. Swing Leg Control\(J_i \in R^{3*3}\) 是足端雅可比;\(\tau _{i,ff}\) 是前馈力矩 \(\Lambda \in R^{3*3}\)是操作空间惯性矩阵;\(a_{i,ref} \in R^{3*3}\)是机体坐标系下的参考加速度 q是关节角度;\(C_i \dot{q}_i + G_i\)是科里奥利力和重力 2. Ground Force Control …

多机训练时的环境变量

多机训练时的环境变量 通过设置环境变量配置分布式训练,仅仅是为了在交互式 Python 环境下,方便查看实验效果。如果不是学习、试验目的,而是生产需求,可以直接通过 oneflow.distributed.launch 启动分布式训练,该模块内部根据命令行参数,自动设置了必要的环境变量。 1)M…

[Java基础]Stream流

当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似。但是实际上,它们完全是不同的东西。 Java8 Stream 使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式…

学习高校课程-软件工程-软件工程(ch2)

DEFINING THE DISCIPLINE THE SOFTWARE PROCESS General Principles2.1 DEFINING THE DISCIPLINE definition for software engineering 软件工程的定义 (1) The application of a systematic, disciplined, quantifiable approach to the development, operation, and mainten…

反汇编分析赋值与自增自减

目录++(--)后置的++(--)真的是先使用,后自增吗?后置++和前置++的差别复杂表达式++i+++i+++i贪心法编译器的贪心规则不是保证一定正确的规则赋值的原理 ++(--)后置的++(--)真的是先使用,后自增吗?概念:前置++是先自增,后使用; 后置++是先使用,后自增. 下面从汇编角度看后置++的…

26. 多进程理论、操作

1. 多进程相关理论 1.1 什么是进程 进程是一个正在执行的任务或程序 负责执行任务的是CPU (1)单任务 单核CPU+多道技术  实现多个进程的伪并发 (2)多任务 多个任务并发执行 1.2 进程和程序的区别 程序是代码的集合体 进程是程序的执行过程 1.3 进程的调度算法 (1)先来…

网络基础--UPnP基本原理

网络基础--UPnP基本原理 1、简介 UPnP是通用即插即用(Universal Plug and Play)的缩写,主要用于设备的智能互联互通,使用UPnP协议不需要设备驱动程序,它可以运行在目前几乎所有的操作系统平台上,使得在办公室、家庭和其他公共场所方便地构建设备互联互通成为可能。UPNP为…