我们可以考虑把每个数字不能达到的点用数组储存起来,值表示的是二进制状态下直达情况,
0表示不能达到,1表示可达到,例如1的二进制表示为:010111011表示1不能直达7,9,3;
但是我们怎么确定1,9之间的点,可以把所经过的点用一个变量以二进制的形式保存,
代码如下
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
typedef long long LL;
using namespace std;
int num[10];//保存的是每个数字不能到达的点
char s[100];
int a[100];//表示序列
int main() {
num[1]=(1<<(7-1))+(1<<(9-1))+(1<<(3-1));
num[2]=(1<<(8-1));
num[3]=((1<<(1-1))+(1<<(7-1))+(1<<(9-1)));
num[4]=(1<<(6-1));
num[6]=(1<<(4-1));
num[7]=((1<<(1-1))+(1<<(3-1))+(1<<(9-1)));
num[8]=(1<<(2-1));
num[9]=((1<<(1-1))+(1<<(3-1))+(1<<(7-1)));
int T;
scanf("%d",&T);
while(T--){
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=1;i<=len;i++) a[i]=s[i]-'0';
int succeed=1;
int c=0;//保存路径
c=1<<(a[1]-1);
for(int i=2;i<=len;i++){
if(num[a[i-1]]&(1<<(a[i]-1))){
int mid=(a[i-1]+a[i])/2;
if(c&(1<<(mid-1))) {
c=c+(1<<(a[i]-1));
}
else {
succeed=0;
break;
}
}
else c=c+(1<<(a[i]-1));
}
if(succeed==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}