Locked Screen

Description

 

大家都知道安卓手机有一个屏幕解锁,这个图案是一个 3*3 的,我们将第一行标记为1,2,3,第二行标记为 4,5,6,第三行标记为 7,8,9,密码本身应该是一个序列,按照时间顺序表示点,但应该遵循以下规则

  1. 密码至少包含 4 个点
  2. 一旦完成一个点,这个点不能再继续通过
  3. 除非已经通过,否则不能跳过路上的中间点,例如: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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值