# #10030. 「一本通 1.4 练习 2」Keyboarding

【题目描述】

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

现在求打印给定文本(要在结尾打印换行符)的最少按键次数。

【算法】

1、预处理四个方向能到达的点。

2、$bfs$ 判重记录状态:

v[i][j]数组记录在(i,j)位置已打印的字符个数,判重:若当前位于(i,j)点将要处理第n个字符则能进入队列的条件是n>v[i][j]

3、1个小优化:

若当前状态和待处理字符匹配,则不打印而继续向四个方向延申的操作肯定非最优

【代码】

#include <bits/stdc++.h>
using namespace std;
struct state{ int x,y,num,step; }st;
int r,c,all,ans;
int a[55][55][4],v[55][55];
char s[55][55],res[10100];
queue<state> q;
const int dx[4]={ -1,0,1,0 },dy[4]={ 0,1,0,-1 };
void parse() {
for(int i=1;i<=r;i++) {
for(int j=1;j<=c;j++) {
for(int k=0;k<4;k++) {
int nx=i,ny=j,t=0;
while(nx>=1&&nx<=r&&ny>=1&&ny<=c) {
if(s[nx][ny]!=s[i][j]) break;
nx+=dx[k],ny+=dy[k],t++;
}
if(nx>=1&&nx<=r&&ny>=1&&ny<=c) a[i][j][k]=t;
}
}
}
}
void bfs() {
v[1][1]=1;
q.push((state){ 1,1,1,0 });
while(q.size()) {
state next,now=q.front(); q.pop();
if(s[now.x][now.y]==res[now.num]&&v[now.x][now.y]<now.num+1) {
v[now.x][now.y]=now.num+1;
next=(state){ now.x,now.y,now.num+1,now.step+1 };
if(next.num>all) { ans=next.step; break; }
q.push(next);
}
else for(int i=0;i<4;i++) {
int bias=a[now.x][now.y][i];
if(bias) {
next=(state){ now.x+bias*dx[i],now.y+bias*dy[i],now.num,now.step+1 };
if(v[next.x][next.y]>=next.num) continue;
v[next.x][next.y]=next.num;
q.push(next);
}
}
}
}
int main() {
scanf("%d%d",&r,&c);
for(int i=1;i<=r;i++) scanf("%s",s[i]+1);
scanf("%s",res+1); res[strlen(res+1)+1]='*';
all=strlen(res+1);
parse();
bfs();
printf("%d\n",ans);
return 0;
}

【其它】 ahhhh,wf的题目~开心

Keyboarding (bfs+预处理+判重优化)的更多相关文章

  1. poj 1465 Multiple(bfs+余数判重)

    题意:给出m个数字,要求组合成能够被n整除的最小十进制数. 分析:用到了余数判重,在这里我详细的解释了.其它就没有什么了. #include<cstdio> #include<cma ...

  2. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  3. hdu 1226 bfs+余数判重+大数取余

    题目: 超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. hdu 1226 超级密码(bfs+余数判重)

    题意:略过 分析:用m个数字组成一个能够被n整除的c进制数的最小值,实际上本题的关键就在于这个最小值上.  首先确定我们的思路是从小到大寻找.先查看一位数,即查看着m个数字是否能被n整除:若不能,就查 ...

  5. hdu1664 bfs+余数判重

    input n 不超过50个例子,n==0结束输入 Sample Input 7 15 16 101 0 output 最少个不同数字的n的倍数的x,若不同数字个数一样,输出最小的x Sample O ...

  6. 逆向bfs搜索打表+康拓判重

    HDU 1043八数码问题 八数码,就是1~8加上一个空格的九宫格,这道题以及这个游戏的目标就是把九宫格还原到从左到右从上到下是1~8然后最后是空格. 没了解康托展开之前,这道题怎么想都觉得很棘手,直 ...

  7. BFS+Hash(储存,判重) HDOJ 1067 Gap

    题目传送门 题意:一个图按照变成指定的图,问最少操作步数 分析:状态转移简单,主要是在图的存储以及判重问题,原来队列里装二维数组内存也可以,判重用神奇的hash技术 #include <bits ...

  8. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  9. UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))

    Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...

随机推荐

  1. BZOJ4625 [BJOI2016]水晶 最小割

    题意简述 给你一个三维的坐标系,坐标系上 \((x_i+y_i+z_i)\bmod 3 = 0\) 的点内有能量源.给定 \(n\) 个点含有能量值为 \(c_i\) 的水晶,如果一个水晶位于能量源上 ...

  2. 【学习笔记】Minkowski和

    这还是个被我咕了N久的玩意 Minkowski和是一个奇怪的玩意 他长这样 $S={a+b \| a \in A , b \in B}$ AB可以是点集也可是向量集(显然) 他可以处理一些奇怪的东西 ...

  3. 【leetcode】1177. Can Make Palindrome from Substring

    题目如下: Given a string s, we make queries on substrings of s. For each query queries[i] = [left, right ...

  4. 千呼万唤始出来——DataV私有部署功能

    DataV的开发者们,今天进入你的用户中心,就会发现有一个小惊喜默默的在等待着你.那就是——私有部署功能上线啦! 一直以来私有部署都是一些有需要的小伙伴所望尘莫及的,毕竟高贵的身份摆在那里,现在不用再 ...

  5. SQL Server性能调优--优化建议(二)

    序言 优化建议 库表的合理设计对项目后期的响应时间和吞吐量起到至关重要的地位,它直接影响到了业务所需处理的sql语句的复杂程度,为提高数据库的性能,更多的把逻辑主外键.级联删除.减少check约束.给 ...

  6. android读取xml

    /*** 从config.xml中获取版本信息以及应用id* * @param urlPath* @return* @throws Exception*/public List getUpdateIn ...

  7. EventBus和Otto第三方构架

    代码 添加依赖:implementation 'org.greenrobot:eventbus:3.0.0'1注册并声明订阅者,然后发布事件最后解除注册 @Override protected voi ...

  8. Flask中的路由配置

    在Flask中也同样有django中的路由配置只不过没有djngo那么严格主要的参数有一下六个记住常用的就可以了 1.endpoint   反向生成url地址标志,默认视图函数名 2.methods ...

  9. Eclipse的switch workspace 选项中删除多余的workspace

    方法1 Eclipse图形化工具: 打开Eclipse后,选择功能菜单里的Windows->Preferences->,弹出对话框后,选择General->Startup and S ...

  10. linux压缩文件命令-zip

    首先cd到要压缩文件的目录,然后使用zip命令压缩文件 zip -r importExcel.zip importExcel -r表示递归 zip [参数]  [打包后的文件名]  [打包的目录路径] ...