King's Phone HDU - 5641(模拟)

King's Phone

HDU - 5641
In a military parade, the King sees lots of new things, including an Andriod Phone. He becomes interested in the pattern lock screen.

The pattern interface is a 3×3 square lattice, the three points in the first line are labeled as 1,2,3, the three points in the second line are labeled as 4,5,6, and the three points in the last line are labeled as 7,8,9。The password itself is a sequence, representing the points in chronological sequence, but you should follow the following rules:

- The password contains at least four points.


- Once a point has been passed through. It can't be passed through again.

- The middle point on the path can't be skipped, unless it has been passed through( 3427 is valid, but 3724 is invalid).

His password has a length for a positive integer k(1k9), the password sequence is s1,s2...sk(0si<INT_MAX)
, he wants to know whether the password is valid. Then the King throws the problem to you.
Input The first line contains a number&nbsp; T(0<T100000), the number of the testcases.

For each test case, there are only one line. the first first number&nbsp; k,represent the length of the password, then k numbers, separated by a space, representing the password sequence s1,s2...sk. Output Output exactly T lines. For each test case, print `valid` if the password is valid, otherwise print `invalid` Sample Input
3
4 1 3 6 2
4 6 2 1 3
4 8 1 6 7
Sample Output
invalid
valid
valid

hint:
For test case #1:The path $1\rightarrow 3$ skipped the middle point $2$, so it's invalid.

For test case #2:The path $1\rightarrow 3$ doesn't skipped the middle point $2$, because the point 2 has been through, so it's valid.

For test case #2:The path $8\rightarrow 1 \rightarrow 6 \rightarrow 7$ doesn't have any the middle point $2$, so it's valid.

主要是是搞懂题目意思

手机按键1 2 3

              4 5 6

              7 8 9

三个条件

1. 密码至少经过四个点。 2. 不能重复经过同一个点。 3. 路径上的中间点不能跳过,除非已经被经过

这里条件3的路径是指按键路径,比如一行123,这个路径如果有13,跳过了中间2,而2之前没出现过就算无效密码

code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int vis[15];
int judge(int a,int b){
//    1 2 3
//    4 5 6
//    7 8 9
    if(a > b) swap(a,b);
    int c = b - a;//计算两个数的差
    if(c == 2 && (a == 1 || a == 4 || a == 7) && !vis[(a+b)/2]) return 0;//如果是每行,中间跳过了返回0
    if(c == 4 && a == 3 && !vis[(a+b)/2]) return 0;//如果是副对角线,中间跳过了返回0
    if((c == 6 || c == 8) && !vis[(a+b)/2]) return 0;//如果是每列,或者主对角线,中间跳过了,返回0
    return 1;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int k,i,j;
        int valid = 1;
        int password[15];
        memset(vis,0,sizeof(vis));
        scanf("%d",&k);
        for(i = 0; i < k; i++){
            scanf("%d",&password[i]);
            if(password[i] < 1 || password[i] > 9) valid = 0;
        }
        if(k < 4 || k > 9 || !valid){
            printf("invalid\n");
            continue;
        }
        vis[password[0]] = 1;
        for(i = 1; i < k; i++){
            vis[password[i]]++;
            if(!judge(password[i-1],password[i]) || vis[password[i]] > 1) valid = 0;
        }
        if(valid) printf("valid\n");
        else printf("invalid\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值