题意:
问题描述
阅兵式上,国王见到了很多新奇东西,包括一台安卓手机。他很快对手机的图形解锁产生了兴趣。
解锁界面是一个 3×3 的正方形点阵,第一行的三个点标号 1,2,3,第二行的三个点标号 4,5,6,第三行的三个点标号 7,8,9。密码本身是一段序列,表示经过点的先后顺序,但遵循如下规则:
1. 密码至少经过四个点。
2. 不能重复经过同一个点。
3. 路径上的中间点不能跳过,除非已经被经过(3427 是合法的,但 3724 不合法)。
他想设置的密码的长度为正整数 k(1≤k≤9),密码序列为 s1s2...sk(0≤si<INT_MAX),他想知道这个密码序列是否合法,这个问题交给了你。
思路:用if语句来枚举出特殊的几个值,然后再进行跨点的判断即可;
#include<stdio.h>
#include<string.h>int a[30];
int vis[30];
int check(int x , int y){
if( x > y ) swap( x , y );
if( x == 1 && y == 3) return 2;
else if( x == 1 && y == 7) return 4;
else if( x == 1 && y == 9) return 5;
else if( x == 2 && y == 8) return 5;
else if( x == 3 && y == 9) return 6;
else if( x == 3 && y == 7) return 5;
else if( x == 4 && y == 6) return 5;
else if( x == 7 && y == 9) return 8;
return -1;
}
void solve()
{
int flag = 0;
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
if(n<4||n>9)
{
printf("invalid\n");
return;
}
for(int i=1;i<=n;i++)
if(a[i]<=0||a[i]>9)
{
printf("invalid\n");
return;
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
if(vis[a[i]])
{
printf("invalid\n");
return;
}
vis[a[i]]++;
}
memset(vis,0,sizeof(vis));
for(int i=1;i<n;i++)
{
vis[a[i]]=1;
int p = check(a[i],a[i+1]);
if(p!=-1&&vis[p]==0)
{
printf("invalid\n");
return;
}
}
printf("valid\n");
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)solve();
return 0;
}