0x01 前置芝士

还是先放个 link 吧。

所需知识点:BFS。

思维难度较高,实现简单。

0x02

题目大意:其实就是给你个图,按顺序走到相应的点,求所需最少步数(走到需要去的点会耗费一次步数)。特殊的,如果你要走的那个方向的字符和当前位一样,你会直接走的与当前位字符不一样的第一个点。

这不难想到直接去初始化a。

我们可以在一开始就暴力找出每个点的四个方向分别可以走到哪里。

然后就是一个简单的BFS了。

因为题意需要,我们可以再定义一个方向 \(5\),它表示当前点是否需要按下选择键。

然后再在BFS的队列中多保存一个走到当前点时,是在前往所求数组中那一个位置上的点的路上。

很显然每次前往某一个点时,重复走走过的点一定不划算,所以我们可以加个记忆数组 \(vis\)。

如果下一个点的 \(vis\) 小于当前这个点再走。\(vis\) 可以看做是第几次经过,或者说可以看做是在去哪个点的路上。(都能做。

维护即可。

0x03

#include <queue>
#include <cstdio>
#include <cstring>
using namespace std; int read() {
int x = 0, k = 1;
char s = getchar();
while (s < '0' || s > '9') {
if (s == '-')
k = -1;
s = getchar();
}
while (s >= '0' && s <= '9') {
x = (x << 3) + (x << 1) + (s ^ 48);
s = getchar();
}
return x * k;
} const int MAXN = 55;
const int MAXL = 1e4 + 5;
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 };
char mp[MAXN][MAXN], s[MAXL];
int r, c, len; struct node {
int x, y;
node() {}
node(int X, int Y) {
x = X;
y = Y;
}
};
node con[MAXN][MAXN][4];
// con[i][j][k] 表示点 (i, j) 往 k 方向走会走到哪里。 void init() { // 暴力初始化
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
for (int k = 0; k < 4; k++) {
int x = i + dx[k], y = j + dy[k];
if (x < 1 || x > r)
continue;
if (y < 1 || y > c)
continue;
while (!(mp[i][j] ^ mp[x][y]) && x <= r && y <= c && x >= 1 && y >= 1)
x = x + dx[k], y = y + dy[k];
if (x >= 1 && x <= r && y >= 1 && y <= c)
con[i][j][k] = node(x, y);
}
} struct data {
node now;
int cnt, ans;
data() {}
data(node Now, int Cnt, int Ans) {
now = Now;
cnt = Cnt;
ans = Ans;
}
}; int vis[MAXN][MAXN];
void bfs() {
memset(vis, -1, sizeof vis);
queue<data> q;
q.push(data(node(1, 1), 0, 0));
// cnt 表示这是在去那个位置上的点的路径上。
// ans 表示最终答案
while (!q.empty()) {
data t = q.front();
q.pop();
int x = t.now.x, y = t.now.y;
for (int i = 0; i <= 4; i++) {
if (i == 4) {
if (mp[x][y] == s[t.cnt + 1] && vis[x][y] < t.cnt + 1) {
vis[x][y]++;
q.push(data(node(x, y), t.cnt + 1, t.ans + 1));
if (t.cnt + 1 == len) {
printf("%d\n", t.ans + 1);
return;
}
}
} else {
node nxt = con[x][y][i];
if (vis[nxt.x][nxt.y] < t.cnt && nxt.x && nxt.y) {
vis[nxt.x][nxt.y]++;
q.push(data(node(nxt.x, nxt.y), t.cnt, t.ans + 1));
}
}
}
}
} int main() {
r = read(), c = read();
for (int i = 1; i <= r; i++) scanf("%s", mp[i] + 1);
init();
scanf("%s", s + 1);
len = strlen(s + 1);
len++;
s[len] = '*';
bfs();
return 0;
}

Keyboading 思路的更多相关文章

  1. .net点选验证码实现思路分享

    哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...

  2. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  3. 整理下.net分布式系统架构的思路

    最近看到有部分招聘信息,要求应聘者说一下分布式系统架构的思路.今天早晨正好有些时间,我也把我们实际在.net方面网站架构的演化路线整理一下,只是我自己的一些想法,欢迎大家批评指正. 首先说明的是.ne ...

  4. js数组去重几种思路

    在一些后台语言中都内置了一些方法来处理数组或集合中重复的数据.但是js中并没有类似的方法,网上已经有一些方法,但是不够详细.部分代码来源于网络.个人总计如下:大致有4种思路 1)使用两次循环比较原始的 ...

  5. [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...

  6. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  7. ENode框架单台机器在处理Command时的设计思路

    设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...

  8. WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...

  9. 浅谈利用SQLite存储离散瓦片的思路和实现方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在多个项目中涉及到互联网地图的内网显示,通过自制工具完成了互联 ...

随机推荐

  1. Mybatis Plus之内置Mapper实践

    MyBatis Plus,作为对MyBatis的进一步增强,大大简化了我们的开发流程,提高了开发速度 配置 由于Mybatis Plus是建立在Mybatis之上的,所以其已经依赖了Mybatis,故 ...

  2. 【CSAPP】Data Lab实验笔记

    前天讲到要刚CSAPP,这一刚就是两天半.CSAPP果然够爽,自带完整的说明文档,评判程序,辅助程序.样例直接百万组走起,管饱! datalab讲的是整数和浮点数怎么用二进制表示的,考验的是用基本只用 ...

  3. Docker系列教程03-Docker私有仓库搭建(registry)

    简介 仓库(Repository)是集中存放镜像的地方,又分为公共镜像和私有仓库. 当我们执行docker pull xxx的时候,它实际上是从registry.docker.com这个地址去查找,这 ...

  4. for循环+数字类型补充

    一.for循环 1.循环取值 1.1列表类型:  定义l=['a','b','c'],要提取列表中的值  如果采用while循环的话:   print(len(l))   i=0   while i& ...

  5. 前后端分离,SpringBoot如何实现验证码操作

    验证码的功能是防止非法用户恶意去访问登录接口而设置的一个功能,今天我们就来看看在前后端分离的项目中,SpringBoot是如何提供服务的. SpringBoot版本 本文基于的Spring Boot的 ...

  6. Spring Boot整合模板引擎freemarker

    jsp本质是servlet,渲染都在服务器,freemarker模板引擎也是在服务器端渲染. 项目结构 引入依赖pom.xml <!-- 引入 freemarker 模板依赖 --> &l ...

  7. 差分隐私(Differential Privacy)定义及其理解

    1 前置知识 本部分只对相关概念做服务于差分隐私介绍的简单介绍,并非细致全面的介绍. 1.1 随机化算法 随机化算法指,对于特定输入,该算法的输出不是固定值,而是服从某一分布. 单纯形(simplex ...

  8. Docker运行资源控制

    概述 ​ 一个 docker host 上会运行若干容器,每个容器都需要 CPU.内存和 IO 资源.对于 KVM,VMware 等虚拟化技术,用户可以控制分配多少 CPU.内存资源给每个虚拟机.对于 ...

  9. django框架2

    内容概要 django小白必会三板斧 静态文件及相关配置 登录功能 静态文件 request对象方法 pycharm链接MySQL django链接MySQL django orm操作 django ...

  10. DirectX11 With Windows SDK--19(Dev) 编译Assimp并加载模型、新的Effects框架

    前言 注意:这一章进行了重写,对应教程Dev分支第19章的项目,在更新完后面的项目后会替换掉原来第19章的教程 在前面的章节中我们一直使用的是由代码生成的几何模型,但现在我们希望能够导入模型设计师生成 ...