写一半去开程序的时候不小心关了网页,LOFTER我都不奢望加入代码高亮,最起码我关闭的时候弹个对话框,再不济也给我定时保存一下草稿吧。

A. Mike and Cellphone

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

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.

·

题意: 对于给定手机键盘上这n个数,手势是否唯一确定这一个数?是的话输出YES,否则输出NO。

这道题一个星期前看到的,当时觉得好难,想了好几个方法都觉得是自己在乱搞,没有什么完整性。

于是上网看了题解后自己实现。

题解参考资料:

http://www.cnblogs.com/q-c-y/p/5660107.html

http://www.voidcn.com/blog/David_Jett/article/p-6089310.html

——————

方法1:

初始化一个数组用来存放每个数和起点的差值,

然后枚举0  - 9 每个数按差值走是否合法,如果有多个合法则为NO,否则为YES。

代码如下:

#include<cstdio>

#include<iostream>

#include<cstring>

using namespace std ;

struct node {

int x,y;

};

node a[] = {3,1,0,0,0,1,0,2,1,0,1,1,1,2,2,0,2,1,2,2};

// 以键盘1为坐标(0,0) 建立坐标系,每个数字坐标

int main()

{

string s ;

int n ;

cin >> n >> s ;

node b[10] ; // 用来存储每个数字与起点直接的差值

node origin ; // 起点

int cnt = 0 ; // 可行数;

int vis[4][3] ;

memset( vis , -1 , sizeof(vis) ) ;

vis[3][0] = 0 ;

vis[3][2] = 0 ;

origin.x = a[ s[0] - '0' ] .x ;

origin.y = a[ s[0] - '0' ] .y ;

for( int i = 0 ; i < n ; i++ ) {

b[i].x = a[ s[i] - '0' ].x - origin.x ;

b[i].y = a[ s[i] - '0' ].y - origin.y ;

}

//px , py 为枚举时当前坐标位置

int px , py ;

for( int i = 0 ; i <= 9 ; i++ ) {

int flag = 1 ;

for( int j = 0 ; j< n ; j++ ) {

px = a[i].x + b[j].x ;

py = a[i].y + b[j].y ;

if( px >= 0 && px <= 3 && py >=0 && py <= 2

        &&  vis[px][py] ) 

continue ;

else {

flag = 0 ;

cout << px << ' ' << py << endl ; 

break;

}

}

if( flag == 1)

cnt++;

}

if( cnt == 1) cout << "YES" << endl;

else cout << "NO" << endl ;

return 0 ;

}

(1)

学到了通过memset( vis , -1 , sizeof( vis) ) 的方法,以前的我可能会用两个循环赋1,学到了-1一样可以这样的效果(memset只能初始化数组为-1 或者0 )

学到了sizeof(vis) 的表示方法,如果是我以前可能会用sizeof( int ) * 3 * 4

(2)

对于布尔代数一直小瞧了,一开始写过一个版本的:

if( px >= 0 && px <= 3 && py >=0 && py <= 2

&&  ( px != 3 && py != 0 ) && ( px != 3 &&  py != 2 )

结果样例都过不了,后来改成:

if( px >= 0 && px <= 3 && py >=0 && py <= 2

&&  ( px != 3 && (py != 0 ||  py != 2 ) )

WA在test10

数据:

Input

2 10

Output

NO

Answer

YES

看起来是0有关的问题。

明明读起来自己很顺口的 , “px不等于3并且py不等于2” 这样的。还是有点小瞧逻辑学了,以后注意这方面。

方法2:

如果有多解,那么一定可以通过对其中一个解进行上下左右平移等到其他解,所以本题思路是对边界判定,如果数列中出现了边界数字,则显然不能向某个方向移动。

代码如下:

#include<iostream>

#include<cstring>

using namespace std ;

int main()

{

int n ;

string s ;

cin >> n >> s ;

int L=1,R=1,U=1,D=1;

for( int i = 0 ; i < n ; i++ ) {

if( s[i] - '0' == 1 || s[i] - '0' == 2 || s[i] - '0' == 3 )

U = 0 ;

if(s[i] - '0' ==  1 || s[i] - '0' == 4 || s[i] - '0' == 7 )

L = 0 ;

if(s[i] - '0' == 3 || s[i] - '0' == 6 || s[i] - '0' == 9 )

R  = 0;

if(s[i] - '0' == 0)

L=0,R=0,D=0;

if(s[i] - '0' == 7 || s[i] - '0' == 9 )

D = 0 ;

}

if( U == 0 && L == 0 && R == 0 && D == 0 )

cout <<"YES"<< endl ;

else cout << "NO" << endl ;

}

最后:

A. Mike and Cellphone(Round 361 Div.2)的更多相关文章

  1. Codeforces Round #361 (Div. 2) A. Mike and Cellphone 水题

    A. Mike and Cellphone 题目连接: http://www.codeforces.com/contest/689/problem/A Description While swimmi ...

  2. Codeforces Round #361 (Div. 2)A. Mike and Cellphone

    A. Mike and Cellphone time limit per test 1 second memory limit per test 256 megabytes input standar ...

  3. Codeforces Round #361 (Div. 2) A

    A - Mike and Cellphone Description While swimming at the beach, Mike has accidentally dropped his ce ...

  4. Codeforces Round #361 (Div. 2) 套题

    A - Mike and Cellphone 问有没有多解,每个点按照给出的序列用向量法跑一遍 #include<cstdio> #include<cstring> #incl ...

  5. CodeForces 689A Mike and Cellphone (模拟+水题)

    Mike and Cellphone 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/E Description While sw ...

  6. Codeforces Round #361 (Div. 2)——B. Mike and Shortcuts(BFS+小坑)

    B. Mike and Shortcuts time limit per test 3 seconds memory limit per test 256 megabytes input standa ...

  7. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 离散化 排列组合

    E. Mike and Geometry Problem 题目连接: http://www.codeforces.com/contest/689/problem/E Description Mike ...

  8. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 && 离散化】

    任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...

  9. Codeforces Round #361 (Div. 2) C. Mike and Chocolate Thieves 二分

    C. Mike and Chocolate Thieves 题目连接: http://www.codeforces.com/contest/689/problem/C Description Bad ...

随机推荐

  1. apache 修改连接数(转)

    1.先要修改最大连接数,必须了解Apache的MPM(Multi -Processing Modules,多道处理模块)Apache2.0中MPM分为3种(perfork.worker.event). ...

  2. sudo命令出错 must set be suid

    特殊权限 4,2 ,1 4  suid,控制用户执行的文件,以文件所属用户的身份执行.当一个可执行的文件拥有suid时,会将文件拥有者的x位变成s(---s--x--x),这时称为set uid,简写 ...

  3. easyui datagrid 的排序问题

    今日遇到一个datagrid排序问题,sortable,sorter函数都已设置,但是始终没有效果,无法在界面自定义排序.后来发现,需要设置remoteSort:false. 切记!!! remote ...

  4. [折腾纪实]JAVA的坑

    开贴记录使用JAVA踩的坑-- P.S. 学习编程最好的方法就是用一个贴心的IDE写,然后隔着屏幕都能感觉到IDE在骂自己SB-- Overridable method calls in constr ...

  5. JavaScript 作用域 匿名函数 模仿块级作用域(私有作用域)

    作用域 对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的. 而javascript没有块级作用域,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境( ...

  6. [Rails] 从 Request 到 Response(2)

    本文翻译自:Rails from Request to Response 系列:个人选择了自己感兴趣的部分进行翻译,需要阅读原文的同学请戳前面的链接. 第二部分 路由(Routing) Blog::A ...

  7. Snacks

    Snacks 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5692 dfs序+线段树 这道题涉及到对整棵树的值修改,考虑将树状结构用dfs ...

  8. java--方法重写与重载

    方法重写 /*方法重写(一般多用在继承上) 定义:它是指子类和父类的关系,子类重写了父类的方法. 两个方法返回值.方法名.参数列表必须完全一致! 出现原因:在Java中,子类可继承父类中的方法,而不需 ...

  9. 《Javascript网页经典特性300例》

    <Javascript网页经典特性300例> 基础篇 第1章:网页特性 刷新.后退.前进.关闭.标题.跳转禁止网页放入框架动态加载js避免浏览器使用缓存加载页面 第2章:DOM操作 根据n ...

  10. PAT 团体程序设计天梯赛-练习集 L1-003. 个位数统计

    给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字 ...