http://www.bnuoj.com/bnuoj/contest_show.php?cid=2876#problem/31796

【题意】:

  如题,注意大小写情况

【code】:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <algorithm>
#include <queue> using namespace std; struct Nod
{
int x,y,step;
}nd1,nd2; int step[][];
char temp[];
int cx[]={,-,,,,-}; //定义六个方向可以移动
int cy[]={,,-,,-,};
char str[][]={
"`1234567890-=***",
"*QWERTYUIOP[]\\**", //这里的反斜杠‘\’必须打两个进行转义
"*ASDFGHJKL;'****",
"*ZXCVBNM,./*****",
"*** ********",
}; int mark[][]; void BFS(int x,int y,int nx,int ny) //4 14 / 5 14
{
memset(mark,,sizeof(mark));
nd1.x = x;
nd1.y = y;
nd1.step = ;
char ch = str[x][y];
step[ch][ch] = ;
if(temp[ch]!=)
{
step[temp[ch]][temp[ch]]=;
step[ch][temp[ch]]=;
step[temp[ch]][ch]=;
}
mark[x][y]=;
queue<Nod> Q;
Q.push(nd1);
while(!Q.empty())
{
nd2 = Q.front();
Q.pop();
int i;
for(i=;i<;i++)
{
nd1.x = nd2.x + cx[i];
nd1.y = nd2.y + cy[i];
nd1.step = nd2.step + ;
if(nd1.x>=&&nd1.x<nx&&nd1.y>=&&nd1.y<ny&&str[nd1.x][nd1.y]!='*'&&!mark[nd1.x][nd1.y])
{
mark[nd1.x][nd1.y]=;
step[str[nd1.x][nd1.y]][ch]=nd1.step;
if(temp[str[nd1.x][nd1.y]]!=)
{
step[temp[str[nd1.x][nd1.y]]][ch]=nd1.step;
}
if(temp[ch]!=)
{
step[str[nd1.x][nd1.y]][temp[ch]]=nd1.step;
}
if(temp[str[nd1.x][nd1.y]]!=&&temp[ch]!=)
{
step[temp[str[nd1.x][nd1.y]]][temp[ch]]=nd1.step;
}
Q.push(nd1);
}
}
}
} void getStepArr()
{
memset(step,-,sizeof(step));
char cc[]="CVBNM,";
int i,j,k;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
char ch = str[i][j];
if(ch!='*')
{
BFS(i,j,,);
}
}
}
//对空格键单独处理
for(i=;i<;i++)
{
for(j=;j<;j++)
{
char ch = str[i][j];
if(ch!='*')
{
int mins = ;
for(k=;k<;k++)
{
if(mins>step[ch][cc[k]])
{
mins=step[ch][cc[k]];
}
}
step[ch][' ']=mins+;
step[' '][ch]=mins+;
if(temp[ch]!=)
{
step[temp[ch]][' ']=mins+;
step[' '][temp[ch]]=mins+; }
}
}
}
} char quer[]; int main()
{
memset(temp,,sizeof(temp));
temp['`']='~';
temp['']='!';
temp['']='@';
temp['']='#';
temp['']='$';
temp['']='%';
temp['']='^';
temp['']='&';
temp['']='*';
temp['']='(';
temp['']=')';
temp['-']='_';
temp['=']='+';
temp['[']='{';
temp[']']='}';
temp['\\']='|';
temp[';']=':';
temp['\'']='"';
temp[',']='<';
temp['.']='>';
temp['/']='?';
getStepArr();
while(gets(quer))
{
int len = strlen(quer);
int i,ans=;
for(i=;i<len;i++) quer[i]=toupper(quer[i]);
for(i=;i<len-;i++)
{
ans+=step[quer[i]][quer[i+]];
}
printf("%d\n",ans);
}
return ;
}

bnuoj 31796 键盘上的蚂蚁(搜索模拟)的更多相关文章

  1. form表单提交和ajax表单提交,关于移动端如何通过软键盘上的【搜索】和【前进】进行提交操作

    [文章来源]由于自己对于form研究甚少,所以一直用的都是AJAX进行提交,这次后台提出要用form提交,顺便深入研究一下:之前在做表单的时候,发现input可以通过设置不同的type属性,调用不同的 ...

  2. js 移动端写搜索时怎么调用软键盘上面的搜索按钮

    这段时间一直在做移动端,所以遇到很多问题,现在很多网站在做移动端搜索的时候都不会在后面加一个搜索按钮,而是直接调用输入法上面的搜索搜索按钮进行搜索 input的一个新属性给我们提供非常方便的书写, 就 ...

  3. BZOJ1033:[ZJOI2008]杀蚂蚁antbuster(模拟)

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右 下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的 ...

  4. 【NOIP 2011】Mayan游戏(搜索+模拟)

    描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关是指在规定的步数 ...

  5. 如何使用alt键+数字键盘上的数字键打出特殊符号

    如何使用alt键+数字键盘上的数字键打出特殊符号 有时当我需要画示意图说明一个问题,但是苦于没有合适的符号,因此,这篇博文将简单介绍一些特殊的符号方便自己以及大家使用. 实现原理很简单:所有的字符(包 ...

  6. 如何用Jquery判断在键盘上敲的哪个按键

    有时候我们需要判断我们在键盘上敲了哪个键,这个需要查询下键盘上的键对应的值是多少,比如Enter键是13. 下面是Jquery代码,别忘了引用Jquery包哈. <script type=&qu ...

  7. IQKeyboardManager在某个页面取消键盘上面的Toolbar

    使用IQKeyboardManager的时候,如果想在某个页面取消键盘上面的Toolbar,请使用如下方法,按控制器去操作 // 取消IQKeyboardManager Toolbar [[IQKey ...

  8. 键盘上各键对应的ASCII码与扫描码

    键盘上各键对应的ASCII码与扫描码 vbKeyLButton 0x1 鼠标左键vbKeyRButton 0x2 鼠标右键vbKeyCancel 0x3 CANCEL 键vbKeyMButton 0x ...

  9. 笔记本键盘上没有break键的解决方案

    django在Windows上调试需要用ctrl+break终止服务器……笔记本键盘上没有break好尴尬…… 在百度搜了很多都没有找到,最后终于在谷歌上找到了英文版的解决方案. starting o ...

随机推荐

  1. hdu1560 搜索

    从原串的最大长度开始枚举,当某个长度的值能保存所有串时,即成功.对每个长度进行深搜,每次取某个串的第一个. #include<iostream> #include<cstdio> ...

  2. React History

    1. browerhistory 1. 推荐使用, 2. nginx服务器要配置try-file,当找不到路由时跳转到首页 3. 使用浏览器history对象,不再允许直接访问nn 所以不能直接拷贝地 ...

  3. 参数请求post, get , delete中的基本使用(2)

    UTF-8数字编码 /// <summary> /// 参数的Url请求 /// </summary> /// <returns></returns> ...

  4. 第一个Apple Watch小例子

    原文在这, 不过他说的add target按照他的说法还真没找到(估计是我的眼瞎了或者是版本不一样),还有就是好记性不如烂博客,先自己能看懂就行了. 请用Single View Application ...

  5. c# using 引用和别名的使用

    1.使用别名 在同时引用的两个命名空间中有相同的类型时,可以使用别名来区分.如下所示: using System; using System.Threading; using System.Timer ...

  6. inline-block元素的一些坑

    当年刚知道CSS display有 inline-block 这个神奇的属性的时候,感觉碉堡了,以为从此不用float了,什么div.p,只要 display: inline-block 就在一行上了 ...

  7. 使用thinkPHP框架实现删除和批量删除一例【原创】

    本文为作者原创,转载请注明原作者及转载地址. 上一篇讲了如何用thinkPHP框架实现数据的添加,那这一篇就讲一下如何用thinkPHP实现数据的删除和批量删除吧. 预期效果图: 原谅博主对照片的处理 ...

  8. C语言中fgetc、fputc和getc、putc的区别是什么

    看书的时候,发现了这四个函数,想知道他们的不同.结果上网查发现很多人说fgetc.fputc的f代表的是file,就是这两个函数是和文件有关的!但是一看他们的函数声明,如下图: 发现他们的参数里面都有 ...

  9. Thinkphp 缓存微信jssdk相关认证参数

    public function getapiSignature() {  $access_token=S('access_token');  //先查询缓存中是否存在  if($access_toke ...

  10. prototype原型理解

    一切都是对象,对象是若干属性的集合   数组是对象.函数是对象.对象还是对象.对象里面的一切都是属性,只有属性,没有方法.方法也是属性. 一切引用类型都是属性 怎么判断一个值是否是对象? 值类型的类型 ...