UVA1714 Keyboarding(bfs)
bfs
坑点很多的一题(由于一本通的辣鸡翻译会错题意*n)。
1.多组数据
2.如果某方向上没有不同字符光标不会动
我们每次预处理出每个点向四个方向下次到达的点。然后跑bfs即可
注意bfs每次只能扩展一层(也就是说距离dis每次最多只能+1,否则无法保证最优性)!(所以不要把移动和选择写到一起qwq)
处理字符用map就好了
(卡了我一整天qwq)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
inline int mini(int &a,int &b) {return a<b ?a:b;}
int d1[]={,,,-};
int d2[]={,,-,};
int n,m,len,a[][],b[],vis[][];
struct data{int x,y,step,dis;}dir[][][];
map <char,int> Map;
void draw(){ //字符处理成数字好写
for(int i=;i<=;++i) Map[(char)(''+i)]=i+;
for(int i=;i<;++i) Map[(char)('A'+i)]=i+;
Map['-']=; Map['*']=;
}
void pretreatment(){ //预处理四个方向上下次可到的点
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
for(int k=;k<;++k){
int r1=i,r2=j;
while(a[r1][r2]==a[r1+d1[k]][r2+d2[k]]) r1+=d1[k],r2+=d2[k];
dir[k][i][j]=(data){r1,r2,,};
}
}
inline int bfs(){
memset(vis,,sizeof(vis));
queue <data> h; int ans=;
int k=;
while(b[k]==a[][]&&k<=len) ++k;
h.push((data){,,k,k-}); vis[][]=k; //特判在起点选取的情况
while(!h.empty()){
data u=h.front(); h.pop();
if(a[u.x][u.y]==b[u.step]){ //选择(千万不能和移动写在一起)
if(u.step==len) {ans=u.dis+; break;}
vis[u.x][u.y]=u.step+;
h.push((data){u.x,u.y,u.step+,u.dis+});
continue;
}
for(int i=;i<;++i){
data to=dir[i][u.x][u.y]; to.x+=d1[i]; to.y+=d2[i]; //由于我的预处理没写完整要再加一次
if(to.x<||to.x>n||to.y<||to.y>m) continue;
if(vis[to.x][to.y]>=u.step) continue;
vis[to.x][to.y]=u.step;
h.push((data){to.x,to.y,u.step,u.dis+});
}
}
return ans;
}
int main(){
//freopen("UVA1714.in","r",stdin);
draw();
char q[];
while(scanf("%d",&n)!=EOF) //多组数据
{
scanf("%d",&m);
for(int i=;i<=n;++i){
scanf("%s",q);
for(int j=;j<m;++j) a[i][j+]=Map[q[j]];
}
scanf("%s",q); len=strlen(q);
for(int i=;i<len;++i) b[i+]=Map[q[i]];
b[++len]=; //b数组存操作串
pretreatment();
printf("%d\n",bfs());
}
return ;
}
UVA1714 Keyboarding(bfs)的更多相关文章
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
- HDU.2612 Find a way (BFS)
HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
随机推荐
- 慕课网,vue高仿饿了吗ASP源码视频笔记
1.源码笔记 我的源码+笔记(很重要):http://pan.baidu.com/s/1geI4i2Z 感谢麦子学院项目相关视频 2.参考资料 Vue.js官网(https://vuejs.org.c ...
- 打jar包
1.在文件夹中新建文件manifest.mf 2.在dos窗口中jar cvfm 名字.jar manifest.mf 所有的编译的类class,中间有空格 3.在dos窗口java -jar 名字 ...
- ubuntu16.04 1080ti显卡驱动安装
https://blog.csdn.net/qq_38451119/article/details/81008165 https://blog.csdn.net/lernering/article/d ...
- Java异常的优势与缺陷,及其处理原则
最近在做一个读取数据库元数据的框架,其中的数据库的检查异常让人印象深刻.try-catch简直让人抓狂,同时作为框架哪些异常时应该抛出来给调用人员,哪些是应该自己处理掉的,抛出来的异常时检查异常还是非 ...
- linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转)
linux是如何组成的?答:linux是由用户空间和内核空间组成的为什么要划分用户空间和内核空间?答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的安全性,比如X86 ...
- Python面试数据库
1.列举常见的关系型数据库和非关系型都有那些? 关系型 : MySQL,SQL Server ,Oracle , Sybase, DB2 非关系型 : Redis, MongodDB 2.MySQL常 ...
- 2018/03/16 每日一个Linux命令 之 rm
最痛快的指令,没有之一. 一次永久删除,恢复很麻烦. 我会告诉你我第一次上服务器的时候删除了项目代码?(还好我提前备份了一下) -- rm [-参数][文件或者文件夹/支持正则通配] 参数: -i 删 ...
- 008-jdk1.7版本新特性
一.JDK1.7 名称:Dolphin(海豚) 发布日期:2011-07-28 新特性: 1.1.switch-case中可以使用字串 区分大小写.Java编译器通过switch使用String对象的 ...
- iOS UI基础-5.0 QQ框架(Storyboard)
1.拉入TabBarController和4个Navigation 2.TabBarController关联Navigation 3.设置消息,拉入一个Button,设置背影 4.联系人,拉入一个Se ...
- #C++初学记录(sort函数)
sort函数 前言:当进行贪心算法的学习时,需要用到sort函数,因为初学c++汇编语言,sort的具体用法没有深入学习,所以这里进行sort学习记录并只有基础用法并借用贪心算法题目的代码. 百度百科 ...