【广搜】Keyboarding
题目描述
现在求打印给定文本(要在结尾打印换行符)的最少按键次数。
输入
接下来给出一个 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数组来更新最优值
 #pragma GCC optimize("Ofast") //编译环境优化
 #include<bits/stdc++.h>
 using namespace std;
 const int N =  ;
 const int M = 1e5+;
 const int P = ;
 char s[M];
 int n,m,len;
 int Map[P],vis[N][N];
 int a[N][N],b[M];
 typedef struct Node{
     int x,y,step,dis;
 }Node ;
 Node F[N][N][];
 int dir[][]={
        {-,},
     {,-},{,},
         {,}
 };
 void read_Char(char s[]){
     int len =  ;
     char c = getchar() ;
     while ( c!='\n' ){
         s[len++] = c;
         c = getchar();
     }
     s[len] = '\0';
 }
 void _Map(){
     for(int i=;i<=;i++){
         Map[char(''+i)] = i+;
     }
     for (int i=;i<;i++){
         Map[char('A'+i)] = i+;
     }
     Map['-'] =  ;
     Map['*'] =  ;
 }
 //预处理,处理每一个方向能到达的位置
 void Init(){
     for(register int i=;i<=n;i++){
         for(register int j=;j<=m;j++){
             for(register int k=;k<;k++){
                 int tx = i,ty = j ;
                 while( a[i][j] == a[tx+dir[k][]][ty+dir[k][]] )
                     tx += dir[k][] , ty += dir[k][];
                 F[i][j][k] = (Node) {tx,ty,,};
             }
         }
     }
 }
 int BFS(){
     memset(vis,,sizeof(vis));
     int k =  ;
     //处理左上角就是目标的输出
     while ( a[][] == b[k] && k<=len ) k++ ;
     queue <Node> Q;
     Q.push( (Node){,,k,k-} ) ;
     vis[][] = k ;
     while( !Q.empty() ){
         Node cur = Q.front();
         //printf("(%d,%d)\n",cur.x,cur.y);
         Q.pop();
         //如果找到合适的位置则"选择"
         if( a[cur.x][cur.y] == b[cur.step] ){
             if( cur.step == len ){
                 return cur.dis +  ;
             }
             vis[cur.x][cur.y] = cur.step +  ;
             Q.push( (Node) { cur.x,cur.y,cur.step+,cur.dis+} ) ;
             continue ;
         }
         //四个方向
         for(int i=;i<;i++){
             Node Next = F[cur.x][cur.y][i] ;
             Next.x += dir[i][];
             Next.y += dir[i][];
             if( !(<=Next.x && Next.x<=n && <=Next.y && Next.y<=m) ){
                 continue;
             }
             //if( a[cur.x][cur.y] == a[Next.x][Next.y] ) continue;
             // 如果后面剪枝过的
             if( vis[Next.x][Next.y] >= cur.step ) continue ;
             vis[Next.x][Next.y] = cur.step ;
             Q.push((Node){Next.x,Next.y,cur.step,cur.dis+} );
         }
     }
 }
 int main()
 {
     _Map();
     //while( cin >> n >> m ){
     while(~scanf("%d%d",&n,&m)){
         //memset(a,'\0',sizeof(a));
         for(register int i=;i<=n;i++){
             scanf("%s",s+);
             //cin >> s+1 ;
             for(register int j=;j<=m;j++){
                 a[i][j] = Map[s[j]];
             }
         }
         scanf("%s",s+);
         //cin >> s+1 ;
         len = strlen(s+);
         for(register int i=;i<=len;i++){
             b[i] = Map[s[i]];
         }
         b[++len] = Map['*'];
         Init();
         printf("%d\n",BFS());
         //cout << BFS() << endl;
     }
     return ;
 }
 /*
 2 19
 ABCDEFGHIJKLMNOPQZY
 X*****************Y
 AZAZ
 */
Keyboarding
【广搜】Keyboarding的更多相关文章
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
		
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
 - HDU 5652(二分+广搜)
		
题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...
 - nyoj 613 免费馅饼 广搜
		
免费馅饼 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...
 - poj 3984:迷宫问题(广搜,入门题)
		
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7635 Accepted: 4474 Description ...
 - poj 3278:Catch That Cow(简单一维广搜)
		
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 45648 Accepted: 14310 ...
 - 双向广搜  POJ 3126  Prime Path
		
POJ 3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16204 Accepted ...
 - 广搜+打表 POJ 1426   Find The Multiple
		
POJ 1426 Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25734 Ac ...
 - 双向广搜  codevs 3060 抓住那头奶牛
		
codevs 3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...
 - 双向广搜+hash+康托展开  codevs 1225 八数码难题
		
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
 - UVa12726 one Friend at a Time (位 广搜)
		
题目链接:UVa12726 是个PDF,不好复制进来. 大意:有个人要追个妹子,想加妹子QQ,但是不知道谁规定的,玩QQ的人要加好友必须先要有至少k个共同好友.共有N个人玩QQ,编号为1到N,1是男主 ...
 
随机推荐
- codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)
			
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删 ...
 - iOS开发系列--地图与定位总结
			
现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的 ...
 - Django 配置实用bootstrap
			
1.下载bootstrap代码包. 2.在目录下创建static文件夹,将bootstrap文件夹移动到static文件夹内,编辑settings.py: 最后添加如下(文件末尾): STATIC_U ...
 - mac-chrome下手动安装vue-devtools
			
原文链接:https://blog.csdn.net/weixin_44868003/article/details/89457089 废话就不多说,直接上安装步骤,一步一步来 => succe ...
 - Facebook币Libra学习-2.交易生命周期
			
交易生命周期 为了更加深入的理解Libra的交易生命周期,我们将跟随一个交易的全过程,从其被提交到Libra validator始,直至其被添加到区块链上止.我们将“放大”来看每个validator逻 ...
 - js常用时间转换函数
			
1.秒转换为时分秒 // 秒转换为时分秒 export function secExchangeMoment(value = 0){ let secondTime = parseInt(value); ...
 - PAT 甲级 1016 Phone Bills (25 分)  (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)
			
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following r ...
 - 详解用python实现简单的遗传算法
			
详解用python实现简单的遗传算法 今天整理之前写的代码,发现在做数模期间写的用python实现的遗传算法,感觉还是挺有意思的,就拿出来分享一下. 首先遗传算法是一种优化算法,通过模拟基因的优胜劣汰 ...
 - Swift加载Xib创建的Controller
			
Xib显示如下: <注意箭头处即可> 按住Control键,点击Files'owner拖动到View即可. 加载该控制器如下: func registerClick() { let reg ...
 - Shell中特殊字符的含义
			
$0 这个程式的执行名字 $n 这个程式的第n个参数值,n=1..9 $* 这个程式的所有参数,此选项参数可超过9个. $# 这个程式的参数个数 $$ 这个程式的PID(脚本运行的当前进程ID号) $ ...