hdu5641 king's phone

题意:

问题描述
阅兵式上,国王见到了很多新奇东西,包括一台安卓手机。他很快对手机的图形解锁产生了兴趣。

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

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

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

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

他想设置的密码的长度为正整数 k(1\le k\le 9)k(1k9),密码序列为 s_1 s_2...s_k(0\le s_i < INT\_MAX)s1s2...sk(0si<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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值