UVA1714 Keyboarding

bfs

坑点很多的一题(由于一本通的辣鸡翻译会错题意*n)。

1.多组数据

2.如果某方向上没有不同字符光标不会动

我们每次预处理出每个点向四个方向下次到达的点。然后跑bfs即可

注意bfs每次只能扩展一层(也就是说距离dis每次最多只能+1,否则无法保证最优性)!(所以不要把移动和选择写到一起qwq)

处理字符用map就好了

(卡了我一整天qwq)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<cmath>
  6. #include<map>
  7. using namespace std;
  8. inline int mini(int &a,int &b) {return a<b ?a:b;}
  9. int d1[]={,,,-};
  10. int d2[]={,,-,};
  11. int n,m,len,a[][],b[],vis[][];
  12. struct data{int x,y,step,dis;}dir[][][];
  13. map <char,int> Map;
  14. void draw(){ //字符处理成数字好写
  15. for(int i=;i<=;++i) Map[(char)(''+i)]=i+;
  16. for(int i=;i<;++i) Map[(char)('A'+i)]=i+;
  17. Map['-']=; Map['*']=;
  18. }
  19. void pretreatment(){ //预处理四个方向上下次可到的点
  20. for(int i=;i<=n;++i)
  21. for(int j=;j<=m;++j)
  22. for(int k=;k<;++k){
  23. int r1=i,r2=j;
  24. while(a[r1][r2]==a[r1+d1[k]][r2+d2[k]]) r1+=d1[k],r2+=d2[k];
  25. dir[k][i][j]=(data){r1,r2,,};
  26. }
  27. }
  28. inline int bfs(){
  29. memset(vis,,sizeof(vis));
  30. queue <data> h; int ans=;
  31. int k=;
  32. while(b[k]==a[][]&&k<=len) ++k;
  33. h.push((data){,,k,k-}); vis[][]=k; //特判在起点选取的情况
  34. while(!h.empty()){
  35. data u=h.front(); h.pop();
  36. if(a[u.x][u.y]==b[u.step]){ //选择(千万不能和移动写在一起)
  37. if(u.step==len) {ans=u.dis+; break;}
  38. vis[u.x][u.y]=u.step+;
  39. h.push((data){u.x,u.y,u.step+,u.dis+});
  40. continue;
  41. }
  42. for(int i=;i<;++i){
  43. data to=dir[i][u.x][u.y]; to.x+=d1[i]; to.y+=d2[i]; //由于我的预处理没写完整要再加一次
  44. if(to.x<||to.x>n||to.y<||to.y>m) continue;
  45. if(vis[to.x][to.y]>=u.step) continue;
  46. vis[to.x][to.y]=u.step;
  47. h.push((data){to.x,to.y,u.step,u.dis+});
  48. }
  49. }
  50. return ans;
  51. }
  52. int main(){
  53. //freopen("UVA1714.in","r",stdin);
  54. draw();
  55. char q[];
  56. while(scanf("%d",&n)!=EOF) //多组数据
  57. {
  58. scanf("%d",&m);
  59. for(int i=;i<=n;++i){
  60. scanf("%s",q);
  61. for(int j=;j<m;++j) a[i][j+]=Map[q[j]];
  62. }
  63. scanf("%s",q); len=strlen(q);
  64. for(int i=;i<len;++i) b[i+]=Map[q[i]];
  65. b[++len]=; //b数组存操作串
  66. pretreatment();
  67. printf("%d\n",bfs());
  68. }
  69. return ;
  70. }

UVA1714 Keyboarding(bfs)的更多相关文章

  1. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  2. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  3. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  4. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  9. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

随机推荐

  1. postgresql安装、可整理成一键安装PG脚本

    yum -y install gcc make readline zlib readline-devel zlib-develtar -jxvf postgresql-9.5.2.tar.bz2cd ...

  2. xcode工程编译错误:No architectures to compile for

    问题 开发环境:xcode6,iPhone6模拟器 xcode工程编译错误:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active ...

  3. 迷宫问题---poj3984(bfs,输出路径问题)

    题目链接 主要就是输出路径问题: pre[x][y]表示到达(x,y)是由点(pre[x][y].x,  pre[x][y].y)而来: #include<stdio.h> #includ ...

  4. Zero-Copy技术

    概述 考虑这样一种常用的情形:你需要将静态内容(类似图片.文件)展示给用户.那么这个情形就意味着你需要先将静态内容从磁盘中拷贝出来放到一个内存buf中,然后将这个buf通过socket传输给用户,进而 ...

  5. study mysql

    SELECT CONCAT(`_`.`drop_default`,`_`.`alter_default`,`_`.`update_default`) AS `sql` FROM ( -- 设置默认值 ...

  6. awesome go library 库,推荐使用的golang库

    https://github.com/avelino/awesome-go https://github.com/spf13/cobra                        # A Comm ...

  7. java客户端调用ftp上传下载文件

    1:java客户端上传,下载文件. package com.li.utils; import java.io.File; import java.io.FileInputStream; import ...

  8. Scala系统学习(一):Scala概述

    Scala是可扩展语言的缩写,是一种混合功能编程语言. 它由Martin Odersky创建. Scala顺利整合面向对象和函数式语言的功能. Scala被编译后在Java虚拟机上运行. 许多现有公司 ...

  9. CentOS6.7上安装Mysql5.7

    CentOS6.7上安装Mysql5.7 2017年07月22日 18:27:05 阅读数:564 环境的配置总是令人作呕,所以这次表明版本条件: 首先,这是一台新机器 其次,CentOS版本如下: ...

  10. hdu1671Phone List(字典树)

    #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h&g ...