whust 2016 warm up E||codeforces 689 A. Mike and Cellphone (模拟)

cf689A

思路:一个老式的电话键盘。。。。给出一个拨号的移动路径。。。问这个路径是否唯一。

思路:如果唯一就说明。。。不能平移。。。否则不唯一。。

平移可以上下左右。。所以先写4个常亮数组。。。标记平移后的结果。。。设置不合法位就可以了。。。

  1/* ***********************************************
  2Author :111qqz
  3Created Time :2016年07月18日 星期一 12时56分28秒
  4File Name :code/2016whust/E.cpp
  5************************************************ */
  6
  7#include <cstdio>
  8#include <cstring>
  9#include <iostream>
 10#include <algorithm>
 11#include <vector>
 12#include <queue>
 13#include <set>
 14#include <map>
 15#include <string>
 16#include <cmath>
 17#include <cstdlib>
 18#include <ctime>
 19#define fst first
 20#define sec second
 21#define lson l,m,rt<<1
 22#define rson m+1,r,rt<<1|1
 23#define ms(a,x) memset(a,x,sizeof(a))
 24typedef long long LL;
 25#define pi pair < int ,int >
 26#define MP make_pair
 27
 28using namespace std;
 29const double eps = 1E-8;
 30const int dx4[4]={1,0,0,-1};
 31const int dy4[4]={0,-1,1,0};
 32const int inf = 0x3f3f3f3f;
 33
 34const int up[15]={8,-1,-1,-1,1,2,3,4,5,6};
 35const int down[15]={-1,4,5,6,7,8,9,-1,0,-1};
 36const int l[15]={-1,-1,1,2,-1,4,5,-1,7,8};
 37const int r[15]={-1,2,3,-1,5,6,-1,8,9,-1};
 38int n;
 39string st;
 40
 41bool solve()
 42{
 43    bool flag = true;
 44    for ( int i = 0 ; i < n ; i++)
 45    {
 46	int x = st[i]-'0';
 47//	cout<<"x:"<<x<<" x+up[x]"<<x+up[x]<<endl;
 48	x = up[x];
 49	if (x==-1)
 50	{
 51	    flag = false;
 52//	    cout<<"uuuuu"<<endl;
 53	    break;
 54	}
 55    }
 56    if (flag) return true;
 57
 58    flag = true;
 59    for ( int i = 0 ; i < n ; i++)
 60    {
 61	int x = st[i]-'0';
 62	x = down[x];
 63	if (x==-1)
 64	{
 65	    flag = false;
 66//	    cout<<"ddd"<<endl;
 67	    break;
 68	}
 69    }
 70    if (flag) return true;
 71
 72    flag = true;
 73    for ( int i = 0 ; i  < n;  i++)
 74    {
 75	int x = st[i]-'0';
 76	x = l[x];	
 77	if (x==-1)
 78	{
 79	    flag = false;
 80//	    cout<<"lll"<<endl;
 81	    break;
 82	}
 83    }
 84
 85    if (flag) return true;
 86    flag = true;
 87
 88    for ( int i =  0 ; i  < n ; i++)
 89    {
 90	int x = st[i]-'0';
 91	x = r[x];
 92	if (x==-1)
 93	{
 94	    flag = false;
 95//	    cout<<"rrr:::"<<endl;
 96	    break;
 97	}
 98    }
 99    if (flag) return  true;
100
101    return false;
102
103
104}
105int main()
106{
107	#ifndef  ONLINE_JUDGE 
108	freopen("code/in.txt","r",stdin);
109  #endif
110
111
112	cin>>n;
113	cin>>st;
114	if (!solve())
115	{
116	    puts("YES");
117	}
118	else
119	{
120	    puts("NO");
121	}
122
123
124
125  #ifndef ONLINE_JUDGE  
126  fclose(stdin);
127  #endif
128    return 0;
129}