【广搜】Keyboarding

题目描述

给定一个r行c列的在电视上的“虚拟键盘”,通过“上,下,左,右,选择”共5个控制键,你可以移动电视屏幕上的光标来打印文本。一开始,光标在键盘的左上角,每次按方向键,光标总是跳到下一个在该方向上与当前位置不同的字符,若不存在则不移动。每次按选择键,则将光标所在位置的字符打印出来。
现在求打印给定文本(要在结尾打印换行符)的最少按键次数。

 

输入

第一行输入 r,c。
接下来给出一个 r×c的键盘,包括大写字母,数字,横线以及星号(星号代表 Enter 换行)。
最后一行是要打印的文本串 S,S 的长度不超过 10000。

 

输出

输出打印文本(包括结尾换行符)的最少按键次数。保证一定有解。

 

样例输入

2 19
ABCDEFGHIJKLMNOPQZY
X*****************Y
AZAZ

样例输出

19

 

提示

对于100%的数据,1≤r,c≤50,S的长度不超过10000。

 



 

【题解】

这个题目需要大家耐心处理细节,预处理所有点的四个方向能到达的地方。

然后用BFS搜索,注意搜索的顺序,已经利用好vis标记数组来记录。

 这个题目是真的需要小心,很多坑。

需要设定一个结构体,这个结构体需要提供记录  当前的坐标(x,y),匹配到下标 step,当前结点的花费的操作次数 dis

1、预处理所有位置的四个方向的下一个位置是什么?

2、设置标准的BFS框架,其中入队列之前,可以预处理左上角就是目标串的字符。

3、进入BFS框架时需要两部分,一个是选择,另一个是四个方向遍历,充分要利用vis数组来更新最优值

 

  1 #pragma GCC optimize("Ofast") //编译环境优化
  2 #include<bits/stdc++.h>
  3 using namespace std;
  4 const int N = 52 ;
  5 const int M = 1e5+10;
  6 const int P = 300;
  7 char s[M];
  8 int n,m,len;
  9 int Map[P],vis[N][N];
 10 int a[N][N],b[M];
 11 typedef struct Node{
 12     int x,y,step,dis;
 13 }Node ;
 14 Node F[N][N][4];
 15 
 16 int dir[4][2]={
 17        {-1,0},
 18     {0,-1},{0,1},
 19         {1,0}
 20 };
 21 void read_Char(char s[]){
 22     int len = 0 ;
 23     char c = getchar() ;
 24     while ( c!='\n' ){
 25         s[len++] = c;
 26         c = getchar();
 27     }
 28     s[len] = '\0';
 29 }
 30 void _Map(){
 31     for(int i=0;i<=9;i++){
 32         Map[char('0'+i)] = i+1;
 33     }
 34     for (int i=0;i<26;i++){
 35         Map[char('A'+i)] = i+11;
 36     }
 37     Map['-'] = 37 ;
 38     Map['*'] = 38 ;
 39 }
 40 //预处理,处理每一个方向能到达的位置
 41 void Init(){
 42     for(register int i=1;i<=n;i++){
 43         for(register int j=1;j<=m;j++){
 44             for(register int k=0;k<4;k++){
 45                 int tx = i,ty = j ;
 46                 while( a[i][j] == a[tx+dir[k][0]][ty+dir[k][1]] )
 47                     tx += dir[k][0] , ty += dir[k][1];
 48                 F[i][j][k] = (Node) {tx,ty,0,0};
 49             }
 50         }
 51     }
 52 }
 53 int BFS(){
 54 
 55     memset(vis,0,sizeof(vis));
 56     int k = 1 ;
 57     //处理左上角就是目标的输出
 58     while ( a[1][1] == b[k] && k<=len ) k++ ;
 59     queue <Node> Q;
 60     Q.push( (Node){1,1,k,k-1} ) ;
 61     vis[1][1] = k ;
 62     while( !Q.empty() ){
 63 
 64         Node cur = Q.front();
 65         //printf("(%d,%d)\n",cur.x,cur.y);
 66         Q.pop();
 67         //如果找到合适的位置则"选择"
 68         if( a[cur.x][cur.y] == b[cur.step] ){
 69             if( cur.step == len ){
 70                 return cur.dis + 1 ;
 71             }
 72             vis[cur.x][cur.y] = cur.step + 1 ;
 73             Q.push( (Node) { cur.x,cur.y,cur.step+1,cur.dis+1} ) ;
 74             continue ;
 75         }
 76         //四个方向
 77         for(int i=0;i<4;i++){
 78             Node Next = F[cur.x][cur.y][i] ;
 79             Next.x += dir[i][0];
 80             Next.y += dir[i][1];
 81 
 82             if( !(1<=Next.x && Next.x<=n && 1<=Next.y && Next.y<=m) ){
 83                 continue;
 84             }
 85             //if( a[cur.x][cur.y] == a[Next.x][Next.y] ) continue;
 86             // 如果后面剪枝过的
 87             if( vis[Next.x][Next.y] >= cur.step ) continue ;
 88             vis[Next.x][Next.y] = cur.step ;
 89             Q.push((Node){Next.x,Next.y,cur.step,cur.dis+1} );
 90         }
 91     }
 92 }
 93 int main()
 94 {
 95     _Map();
 96     //while( cin >> n >> m ){
 97     while(~scanf("%d%d",&n,&m)){
 98         //memset(a,'\0',sizeof(a));
 99         for(register int i=1;i<=n;i++){
100             scanf("%s",s+1);
101             //cin >> s+1 ;
102             for(register int j=1;j<=m;j++){
103                 a[i][j] = Map[s[j]];
104             }
105         }
106         scanf("%s",s+1);
107         //cin >> s+1 ;
108         len = strlen(s+1);
109         for(register int i=1;i<=len;i++){
110             b[i] = Map[s[i]];
111         }
112         b[++len] = Map['*'];
113         Init();
114         printf("%d\n",BFS());
115         //cout << BFS() << endl;
116     }
117     return 0;
118 }
119 /*
120 2 19
121 ABCDEFGHIJKLMNOPQZY
122 X*****************Y
123 AZAZ
124 */
Keyboarding

 

 

转载于:https://www.cnblogs.com/Osea/p/11215807.html

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

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

相关文章

3.1_ _2_ 内存管理的概念

知识总览 内存空间的分配和回收 内存空间的扩展 地址转换 内存保护 知识回顾

Yann LeCun:发现智能原理是AI的终极问题 | 独家对话

来源&#xff1a;智源社区对话整理&#xff1a;李梦佳 周致毅导读&#xff1a;在《科学之路&#xff1a;人&#xff0c;机器与未来》一书中&#xff0c;图灵奖得主&#xff0c;卷积网络之父杨立昆&#xff08;Yann LeCun&#xff09;提出&#xff0c;在科学史上&#xff0c;技术…

4.1.2电路交换、报文交换与分组交换

1.网络的掌中宝 2.为什么要进行数据交换 3.数据交换方式 3.1 电话交换 3.2报文交换 3.3分组交换 3.4 报文交换和分组交换 3.5三种数据交换比较总结

leetcode-187-重复的DNA序列

题目描述&#xff1a; 方法一&#xff1a; class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n 10d {}for i in range(len(s)-9):if s[i:i10] in d:d[s[i:i10]] Trueelse:d[s[i:i10]] Falsereturn [i for i in d if d[i]] 方法二&#xff1a; c…

机器人视觉三维成像技术全解析

来源&#xff1a;卢荣胜,史艳琼,胡海兵. 机器人视觉三维成像技术综述[J]链接&#xff1a;http://www.opticsjournal.net/Articles/Abstract/lop/57/4/040001.cshtml原题&#xff1a;机器人视觉三维成像技术综述摘要本文针对智能制造领域机器人视觉感知中的三维视觉成像技术进行…

4.1.3数据报与虚电路

4.1.3数据报与虚电路 文章目录4.1.3数据报与虚电路1.三种数据交换方式比较总结2.数据报方式&虚电路方式3.几种传输单元名词解析4.数据报5.虚电路数据报&虚电路 对比总结1.三种数据交换方式比较总结 2.数据报方式&虚电路方式 3.几种传输单元名词解析 4.数据报 5.虚电…

MIT物理学家观察超冷原子形成量子龙卷风晶体

来源&#xff1a;诸平科学网博客链接地址&#xff1a;https://blog.sciencenet.cn/blog-212210-1319857.htmlJust like the formation of weather patterns on Earth, here a spinning fluid of quantum particles breaks up into a crystal formed from swirling, tornado-lik…

4.2路由算法与路由协议概述

4.2路由算法与路由协议概述 文章目录4.2路由算法与路由协议概述1.路由算法2.路由算法的分类3.分层次的路由选择协议1.路由算法 2.路由算法的分类 3.分层次的路由选择协议

北大200页元宇宙报告!六大板块,看20家巨头的元宇宙布局 | 智东西内参

来源 北京大学汇丰商学院 安信证券作者&#xff1a;魏炜 等原标题&#xff1a;《元宇宙2022——蓄积的力量》如何看待元宇宙这一新事物&#xff1f;有人说元宇宙是未来互联网的发展目标&#xff0c;是人类信息技术的另一场革命&#xff0c;也有人说元宇宙概念只是“割韭菜”的套…

4.3.1 IP数据报格式

4.3.1 IP数据报格式 文章目录4.3.1 IP数据报格式1.TCP/IP协议栈2.IP数据报格式1.TCP/IP协议栈 2.IP数据报格式

人工智能可以发现数据中隐藏的物理规律

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮神户大学和大阪大学的研究人员成功开发了人工智能技术&#xff0c;可以从常规观测数据中提取隐藏的运动方程&#xff0c;并创建一个遵循物理定律的模型。这项技术可以让研究人员发现现象背后隐藏的运动方程&#xff0c;而这些方…

4.3.2 IP数据报分片

4.3.2 IP数据报分片 文章目录4.3.2 IP数据报分片1.最大传输单元2.IP数据报格式3.IP数据报分片例题4.IP数据报格式1.最大传输单元 2.IP数据报格式 3.IP数据报分片例题 4.IP数据报格式

Nature:AI 引导人类直觉,帮助发现数学定理

来源&#xff1a;集智俱乐部作者&#xff1a;Alex Davies, Petar Veličković, Lars Buesing等译者&#xff1a;赵雨亭 审校&#xff1a;潘佳栋 编辑&#xff1a;邓一雪导语我们通常认为&#xff0c;数学家的世界充满了直觉和想象力&#xff0c;他们发现模型、提出猜想、证明定…

4.3.3 IPv4地址

4.3.3 IPv4地址 文章目录4.3.3 IPv4地址1.ip地址2. IP编址的历史阶段2.分类的IP地址3.互联网中的IP地址4.分类的ip地址5.特殊ip地址6.私有ip地址7.分类的ip地址1.ip地址 2. IP编址的历史阶段 2.分类的IP地址 3.互联网中的IP地址 4.分类的ip地址 5.特殊ip地址 6.私有ip地址 7.分…

8大趋势已现,未来传感器将彻底改变你的生活!

来源&#xff1a;传感器专家网 现代信息技术发展到2022年&#xff0c;传感器的重要性越来越高&#xff0c;物联网、元宇宙、人工智能、自动驾驶……无不离不开传感器。2022年&#xff0c;传感器更伴随着这些技术的发展&#xff0c;进一步改变我们的生活&#xff0c;同时传感器本…

error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”...

1.错误提示与原因分析 或者是提示&#xff1a;error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2。 此类问题出现的根本原因就是&#xff0c;你引用的lib库的debug或release版本&#xff0c;与本工程的dubug或release版本不符合。这类问题在引用文…

4.3.4 网络地址转换NAT

4.3.4 网络地址转换NAT 文章目录4.3.4 网络地址转换NAT1.私有ip地址2. 网络地址转换nat1.私有ip地址 2. 网络地址转换nat

day-17 包与模块

包 logging 模块 logging 配置字典 hashlib 模块 openpyxl 模块 深浅拷贝 一 模块 1.0.1 模块回顾 模块 # 三种来源1.内置的2.第三方的3.自定义的 # 四种表示形式1.py文件(******)2.共享库3.文件夹(一系列模块的结合体)(******)4.C编译的连接到python内置的 1.0.2 模块与包 # 研…

Jeff Dean长文展望:2021年之后,机器学习领域的五大潜力趋势

来源&#xff1a;机器之心报编辑&#xff1a;杜伟、蛋酱2021 年之后&#xff0c;机器学习将会对哪些领域产生前所未有的影响&#xff1f;在过去的数年&#xff0c;见证了机器学习&#xff08;ML&#xff09;和计算机科学领域的许多变化。按照这种长弧形的进步模式&#xff0c;人…

4.3.5子网划分和子网掩码

4.3.5子网划分和子网掩码 文章目录4.3.5子网划分和子网掩码1.子网划分2.使用子网时分组的转发1.子网划分 2.使用子网时分组的转发 相关链接-计算机网络&#xff08;4.10&#xff09;网络层- 使用子网时分组的转发