USACO-Section1.3 Combination Lock[其他]

题目:

为了防止聪明的牛逃跑,农场主买了一把劣质密码锁(三个数字轮盘可以转的那种),只要数字和本来的密码相差2个距离以内就算是匹配。输入n表示数字轮盘上共有n个数字,再输入6个数,分为两组,分别代表农场主设置的密码和锁自带的密码。如果牛旋转数字轮盘,匹配了其中一组,就可以打开锁。
例如:输入 50 1 2 3 5 6 7,则输出249。详情:
1,1,1 2,2,4 3,4,2 4,4,5 5,4,8 6,5,6 7,5,9 3,50,2 50,1,4
1,1,2 2,2,5 3,4,3 4,4,6 5,4,9 6,5,7 7,6,5 3,50,3 50,1,5
1,1,3 2,3,1 3,4,4 4,4,7 5,5,5 6,5,8 7,6,6 3,50,4 50,2,1
1,1,4 2,3,2 3,4,5 4,4,8 5,5,6 6,5,9 7,6,7 3,50,5 50,2,2
1,1,5 2,3,3 3,4,6 4,4,9 5,5,7 6,6,5 7,6,8 49,1,1 50,2,3
1,2,1 2,3,4 3,4,7 4,5,5 5,5,8 6,6,6 7,6,9 49,1,2 50,2,4
1,2,2 2,3,5 3,4,8 4,5,6 5,5,9 6,6,7 7,7,5 49,1,3 50,2,5
1,2,3 2,4,1 3,4,9 4,5,7 5,6,5 6,6,8 7,7,6 49,1,4 50,3,1
1,2,4 2,4,2 3,5,5 4,5,8 5,6,6 6,6,9 7,7,7 49,1,5 50,3,2
1,2,5 2,4,3 3,5,6 4,5,9 5,6,7 6,7,5 7,7,8 49,2,1 50,3,3
1,3,1 2,4,4 3,5,7 4,6,5 5,6,8 6,7,6 7,7,9 49,2,2 50,3,4
1,3,2 2,4,5 3,5,8 4,6,6 5,6,9 6,7,7 7,8,5 49,2,3 50,3,5
1,3,3 3,1,1 3,5,9 4,6,7 5,7,5 6,7,8 7,8,6 49,2,4 50,4,1
1,3,4 3,1,2 3,6,5 4,6,8 5,7,6 6,7,9 7,8,7 49,2,5 50,4,2
1,3,5 3,1,3 3,6,6 4,6,9 5,7,7 6,8,5 7,8,8 49,3,1 50,4,3
1,4,1 3,1,4 3,6,7 4,7,5 5,7,8 6,8,6 7,8,9 49,3,2 50,4,4
1,4,2 3,1,5 3,6,8 4,7,6 5,7,9 6,8,7 1,50,1 49,3,3 50,4,5
1,4,3 3,2,1 3,6,9 4,7,7 5,8,5 6,8,8 1,50,2 49,3,4 49,50,1
1,4,4 3,2,2 3,7,5 4,7,8 5,8,6 6,8,9 1,50,3 49,3,5 49,50,2
1,4,5 3,2,3 3,7,6 4,7,9 5,8,7 7,4,5 1,50,4 49,4,1 49,50,3
2,1,1 3,2,4 3,7,7 4,8,5 5,8,8 7,4,6 1,50,5 49,4,2 49,50,4
2,1,2 3,2,5 3,7,8 4,8,6 5,8,9 7,4,7 2,50,1 49,4,3 49,50,5
2,1,3 3,3,1 3,7,9 4,8,7 6,4,5 7,4,8 2,50,2 49,4,4 50,50,1
2,1,4 3,3,2 3,8,5 4,8,8 6,4,6 7,4,9 2,50,3 49,4,5 50,50,2
2,1,5 3,3,3 3,8,6 4,8,9 6,4,7 7,5,5 2,50,4 50,1,1 50,50,3
2,2,1 3,3,4 3,8,7 5,4,5 6,4,8 7,5,6 2,50,5 50,1,2 50,50,4
2,2,2 3,3,5 3,8,8 5,4,6 6,4,9 7,5,7 3,50,1 50,1,3 50,50,5
2,2,3 3,4,1 3,8,9 5,4,7 6,5,5 7,5,8

题解:

刚开始我想的方法是把所有情况都模拟(也就是可以直接输出所有情况)后来嫌烦放弃了。因为我发现这三个数字是重复的,所以实际上就是250(大于5个数字的情况,小于5就n^3就行了)减去可能出现的相同情况,比如说样例中的3,4,5就是两个密码都匹配的结果。而我没想出能把首末的情况统一的计算方法,于是就设置了很多的情况判断,虽然繁杂但行之有效。

代码

(可以说是非常丑陋了)

/*
ID: xcwhkh1
LANG: C
TASK: combo
*/
#include <stdio.h>
#include <string.h>
int main () {
    FILE *fin=fopen("combo.in","r");
    FILE *fout=fopen("combo.out","w");
    int n,i,sum=1;
    int a[3],b[3],c[3];
    for(i=0;i<3;i++)
        c[i]=0; 
    fscanf(fin,"%d",&n);
    fscanf(fin,"%d%d%d%d%d%d",&a[0],&a[1],&a[2],&b[0],&b[1],&b[2]);
    if(n<=5)
    {
        fprintf(fout,"%d\n",n*n*n);
        return 0;
    }
    else
        for(int i=0;i<3;i++)
        {
            if(a[i]-b[i]>=0&&a[i]-b[i]<=4)
                c[i]=5-a[i]+b[i];
            if(b[i]-a[i]>=0&&b[i]-a[i]<=4)
                c[i]=5-b[i]+a[i];
            if(a[i]==1)
                if(b[i]>=n-3)
                    c[i]=b[i]-(n-4);
            if(a[i]==2)
                if(b[i]>=n-2)
                    c[i]=b[i]-(n-3);
            if(a[i]==3)
                if(b[i]>=n-1)
                    c[i]=b[i]-(n-2);
            if(a[i]==4)
                if(b[i]>=n)
                    c[i]=b[i]-n+1;
            if(b[i]==1)
                if(a[i]>=n-3)
                    c[i]=a[i]-(n-4);
            if(b[i]==2)
                if(a[i]>=n-2)
                    c[i]=a[i]-(n-3);
            if(b[i]==3)
                if(a[i]>=n-1)
                    c[i]=a[i]-(n-2);
            if(b[i]==4)
                if(a[i]>=n)
                    c[i]=a[i]-n+1;
        }
    for(i=0;i<3;i++)
        sum*=c[i];
    fprintf(fout,"%d\n",250-sum);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值