题意:有十个键的手机键盘,按下一个长度为n的序列,问按照这种序列的手势能否按出其它的序列,如果能输出NO,否则输出YES。
题解:我们可以吧这种序列的手势按上下左右平移就行,如果能平移,则能按出其它的序列,上下左右的方向可以用数组表示,div[4]={-3,3,-1,1}
特殊元素特殊处理:
①0只能上移
②8可以下移
③1,4,7不能左移
④3,6,9不能右移
具体见代码
#include <iostream> using namespace std; int div[4]={-1,1,-3,3}; int main() { int n; string a; cin>>n; cin>>a; bool ok=true; for(int i=0;i<4;i++) { int j; for(j=0;j<n;j++) { if(a[j]=='0' && i!=2) break; if(a[j]=='0' && i==2) continue; if(a[j]=='8' && i==3) continue; if( (a[j]=='1' || a[j]=='4' || a[j]=='7') && i==0 ) break; if( (a[j]=='3' || a[j]=='6' || a[j]=='9') && i==1 ) break; int temp=a[j]-'0'+div[i]; if(temp<=0 || temp>=10) break; } if(j==n) ok=false; } if(ok) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }