Description
大家都知道安卓手机有一个屏幕解锁,这个图案是一个 3*3 的,我们将第一行标记为1,2,3,第二行标记为 4,5,6,第三行标记为 7,8,9,密码本身应该是一个序列,按照时间顺序表示点,但应该遵循以下规则
- 密码至少包含 4 个点
- 一旦完成一个点,这个点不能再继续通过
- 除非已经通过,否则不能跳过路上的中间点,例如:3427 有效但是 3724 无效
现在小 Q 给你一个密码序列,他知道长度和序列中经过各个点的顺序,现在想问你这个密码是否有效
Input
输入第一行一个整数 T,代表接下来有 T 组测试数据对于每一组测试数据,
输入一行,先输入一个 k,代表密码长度,
后面跟着 k 个整数,代表密码序列
1<=T<=100000,1<=k<=9,保证密码序列的数字在 1--9 之间
Output
对于每一组测试数据,如果这个密码是有效的,请输出 valid,若无效请输出 invalid
Sample Input 1
2 4 1 2 3 4 4 1 2 3 2
Sample Output 1
valid invalid
//这道题主要是几个if判断,因为不能跳过一个点到达另一个点,所以在最开始的时候,我写了一个标志数组b,如果没有走过则为0,走过则置1。
//temp=1时表示密码锁不可解
如果代码长度小于4,temp=1;是跳过一个数到达另一个数,temp=1;重复经过一个点,temp=1;
#include<iostream>
#include<cstring>
using namespace std;
int a[100];//顺序输入的密码值
int b[100]={0};//给走过的密码设立标志,1为走过,0没走过
int temp=0;//若为1则说明,这个密码锁不可用;
int main(){
int t,n;
cin>>t;
while(t--){
temp=0;
cin>>n;
cin>>a[1];
b[a[1]]=1;//之前一直wa 是这里忘记置1了;
if(n<4){
temp=1;
}
for(int i=2;i<=n;i++){
cin>>a[i];
if(b[a[i]]==1){
temp= 1;
}
else{
b[a[i]]=1;//第一次走过了,给置1;
if(a[i]==1)
{
if((a[i-1]==3&&b[2]==0)||(a[i-1]==7&&b[4]==0)||(a[i-1]==9&&b[5]==0)){
temp=1;
}
}
if(a[i]==2){
if(a[i-1]==8&&b[5]==0){
temp=1;
}
}
if(a[i]==3){
if((a[i-1]==1&&b[2]==0)||(a[i-1]==7&&b[5]==0)||(a[i-1]==9&&b[6]==0)){
temp=1;
}
}
if(a[i]==4){
if((a[i-1]==6&&b[5]==0)){
temp=1;
}
}
if(a[i]==6){
if(a[i-1]==4&&b[5]==0){
temp=1;
}
}
if(a[i]==7){
if((a[i-1]==1&&b[4]==0)||(a[i-1]==3&&b[5]==0)||(a[i-1]==9&&b[8]==0)){
temp=1;
}
}
if(a[i]==8){
if(a[i-1]==2&&b[5]==0){
temp=1;
}
}
if(a[i]==9){
if((a[i-1]==1&&b[5]==0)||(a[i-1]==3&&b[6]==0)||(a[i-1]==7&&b[8]==0)){
temp=1;
}
}
}
}
if(temp==1){
cout<<"invalid"<<endl;
}
else{
cout<<"valid"<<endl;
}
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
temp=0;
}
return 0;
}