zoukankan      html  css  js  c++  java
  • B

    Problem description

    While swimming at the beach, Mike has accidentally dropped his cellphone into the water. There was no worry as he bought a cheap replacement phone with an old-fashioned keyboard. The keyboard has only ten digital equal-sized keys, located in the following way:

    Together with his old phone, he lost all his contacts and now he can only remember the way his fingers moved when he put some number in. One can formally consider finger movements as a sequence of vectors connecting centers of keys pressed consecutively to put in a number. For example, the finger movements for number "586" are the same as finger movements for number "253":

    Mike has already put in a number by his "finger memory" and started calling it, so he is now worrying, can he be sure that he is calling the correct number? In other words, is there any other number, that has the same finger movements?

    Input

    The first line of the input contains the only integer n (1 ≤ n ≤ 9) — the number of digits in the phone number that Mike put in.

    The second line contains the string consisting of n digits (characters from '0' to '9') representing the number that Mike put in.

    Output

    If there is no other phone number with the same finger movements and Mike can be sure he is calling the correct number, print "YES" (without quotes) in the only line.

    Otherwise print "NO" (without quotes) in the first line.

    Examples

    Input

    3
    586

    Output

    NO

    Input

    2
    09

    Output

    NO

    Input

    9
    123456789

    Output

    YES

    Input

    3
    911

    Output

    YES

    Note

    You can find the picture clarifying the first sample case in the statement above.

    解题思路:题目的意思就是凭借手指记忆在老式键盘上按密码,如果该记忆手势产生的密码唯一,则为"YES",否则为"NO"。做法:将该记忆路径向四个方向(上下左右)各移动一格,如果都超出老式键盘的范围,说明记忆手势产生的密码唯一,则输出"YES",否则输出"NO",具体注解看代码,一遍简单过。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 /*tmp[6][5]:
     4    0  1  2  3  4
     5 0 -1 -1 -1 -1 -1
     6 1 -1  1  2  3 -1
     7 2 -1  4  5  6 -1
     8 3 -1  7  8  9 -1
     9 4 -1 -1  0 -1 -1
    10 5 -1 -1 -1 -1 -1
    11 */
    12 int main(){
    13     int n,tmp[6][5],cnt=1,num=0,dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//方向数组:上右下左
    14     char s[10];bool flag;
    15     memset(tmp,-1,sizeof(tmp));tmp[4][2]=0;
    16     map<char,pair<int,int> > mp;//键值对,表示键盘中数字对应的坐标(first,second)
    17     mp['1'].first=1,mp['1'].second=1;
    18     mp['2'].first=1,mp['2'].second=2;
    19     mp['3'].first=1,mp['3'].second=3;
    20     mp['4'].first=2,mp['4'].second=1;
    21     mp['5'].first=2,mp['5'].second=2;
    22     mp['6'].first=2,mp['6'].second=3;
    23     mp['7'].first=3,mp['7'].second=1;
    24     mp['8'].first=3,mp['8'].second=2;
    25     mp['9'].first=3,mp['9'].second=3;
    26     mp['0'].first=4,mp['0'].second=2;
    27     for(int i=1;i<4;++i)//tmp数组初始化
    28         for(int j=1;j<4;++j)
    29             tmp[i][j]=cnt++;
    30     cin>>n;getchar();//吃掉回车符对字符串的影响
    31     cin>>s;
    32     for(int x=0;x<4;++x){//枚举四个方向
    33         flag=false;
    34         for(int j=0;j<n;++j)
    35             if(tmp[mp[s[j]].first+dir[x][0]][mp[s[j]].second+dir[x][1]]<0){flag=true;break;}
    36         if(flag){num++;}//只要小于0,即超出老式键盘的范围,计数器就加1
    37     }
    38     if(num==4)cout<<"YES"<<endl;//只要向4个方向移动一格后都超出老式键盘的范围,说明记忆手势产生唯一的按键密码,则该密码正确
    39     else cout<<"NO"<<endl;//否则还有其他不确定的密码,则为NO
    40     return 0;
    41 }
  • 相关阅读:
    jquery滑动效果的运动模块封装
    jquery幻灯片淡入淡出组件封装
    vue目录结构熟悉
    npm安装Vue.js
    jQuery瀑布流插件masonry
    mysql 使用 limit ,从指定条数读取完,-1失效
    jquery二级导航
    带输入提示的搜索框ajax请求
    封装好通用的reset.css base.css 样式重置css文件
    mysql 同时支持多少连接MYSQL 查看最大连接数和修改最大连接数
  • 原文地址:https://www.cnblogs.com/acgoto/p/9147403.html
Copyright © 2011-2022 走看看