King's Phone

http://acm.hdu.edu.cn/showproblem.php?pid=5641

King’s Phone

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2883 Accepted Submission(s): 657

Problem Description
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(1≤k≤9), the password sequence is s1,s2…sk(0≤ si < 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 T(0 < T ≤ 100000), the number of the testcases.

For each test case, there are only one line. the first first number 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 13 skipped the middle point 2 , so it’s invalid.

For test case #2:The path 13 doesn’t skipped the middle point 2 , because the point 2 has been through, so it’s valid.

For test case #2:The path 8167 doesn’t have any the middle point 2 <script type="math/tex" id="MathJax-Element-600">2</script>, so it’s valid.

Source
BestCoder Round #75

手机的解锁界面是一个3×3 的正方形点阵,第一行的三个点标号 1, 2, 3,第二行的三个点标号 4, 5, 6,第三行的三个点标号7,8,9。密码本身是一段序列,表示经过点的先后顺序,但遵循如下规则:

1.密码至少经过四个点。

2.不能重复经过同一个点。

3.路径上的中间点不能跳过,除非已经被经过(3427 是合法的,但 3724 不合法)。

他想设置的密码的长度为正整数 kk(1≤k≤9),密码序列为 s_1 s_2…s_k(0<=s_i < INT MAX)
他想知道这个密码序列是否合法,这个问题交给了你。

输入描述
第一行一个整数表示测试组数:T (0 < T ≤100000) 。
每组数据占一行,每行第一个数 k,设置密码的长度;接着 k个正整数,之间用空格隔开,表示密码序列 s_1s_2…s_k。

输出描述
共 T 行。对每组数据,若合法输出 valid,否则输出 invalid。

输入样例
3
4 1 3 6 2
4 6 2 1 3
4 8 1 6 7

输出样例
invalid
valid
valid

Hint
对于第一组数据,1 到 3 跳过了路径上的点 2,所以不合法。

对于第二组数据,1 到 3 时点 2已经被经过了,所以合法。

对于第三组数据,8→1→6→7 路径均没有中间点,所以合法。

要注意a[i]的值在1-9之间。
if(b[a[i]]==1)
{
f=0;
break;
}用来判断第二个条件。
之后的用来判断第三个条件。

#include<stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
    int T,n,i,a[10],b[100];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        memset(b,0,sizeof(b));//b[]要有初始值
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        if(n<4)
        {
            printf("invalid\n");
            continue;
        }
        int f=1;
        for(int i=0; i<n-1; i++)
        {
            if(a[i]>9||a[i]<1)
            {
                f=0;
                break;
            }
            if(b[a[i]]==1)
            {
                f=0;
                break;
            }
            b[a[i]]=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))
                    f=0;
            }
            if(a[i]==2)
            {
                if(a[i+1]==8&&b[5]==0)
                    f=0;
            }
            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))
                    f=0;
            }
            if(a[i]==4)
            {
                if(a[i+1]==6&&b[5]==0)
                    f=0;
            }
            if(a[i]==6)
            {
                if(a[i+1]==4&&b[5]==0)
                    f=0;
            }
            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))
                    f=0;
            }
            if(a[i]==8)
            {
                if(a[i+1]==2&&b[5]==0)
                    f=0;
            }
            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))
                    f=0;
            }
        }
        if(b[a[n-1]]==1||a[n-1]>9||a[n-1]<1)
            f=0;
        if(f==0)
          printf("invalid\n");
        else
            printf("valid\n");
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值