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
1→3
skipped the middle point
2
, so it’s invalid.
For test case #2:The path
For test case #2:The path
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;
}