USACO Section 1.3 Combination Lock

来源:互联网 发布:手机ui界面设计软件 编辑:程序博客网 时间:2024/06/05 19:18

题目描述

农夫约翰的奶牛不断逃离农场,造成恶作剧。为了试图阻止他们离开,他购买了一个花式的组合锁,以防止他的母牛打开牧场门。

知道他的牛很聪明,农夫约翰想确保他们不能轻易地打开锁,只需尝试许多不同的组合。锁具有三个刻度盘,每个编号为1..N(1 <= N <= 100),其中1和N相邻,因为表盘是圆形的。有两个组合可以打开锁,一个由Farmer John设置,也是由锁定器设置的“主”组合。

锁具有一个很小的误差容限,所以即使拨号上的数字都在有效组合的最多2个位置,它也会打开。
例如,如果农夫约翰的组合是(1,2,3),主组合是(4,5,6),则如果拨号设置为(1,3,5),则锁将打开(因为这是关闭的足够给农夫约翰的组合)或(2,4,8)(因为这足够接近主组合)。请注意,(1,5,6)不会打开锁,因为它不够接近任何一个单一组合。
给定农夫约翰的组合和主组合,请确定打开锁的拨盘的不同设置的数量。订购事宜,所以设置(1,2,3)不同于(3,2,1)。

程序名称:combo
输入格式

第1行:整数N.
行2:三个空格分隔的整数,指定农夫约翰的组合。
第3行:三个空格分隔的整数,指定主组合(可能与Farmer John的组合相同)。

输入 (file combo.in)

501 2 35 6 7
输入注意:
每个拨号号码为1..50。 农民约翰的组合是(1,2,3),主要组合是(5,6,7)。

输出格式

行1:打开锁定的不同拨号设置的数量。

输出(file combo.out)
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,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,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,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,6,6,6,7,6,9 49,1,2,50,2,4
1,2,2,3,5 3,4,8 4,5,6,5,5,6,6,7,7,7,5 49,1,3,50,2,5
1,2,3,4,1,4,9 4,5,7 5,6,5,6,6,8,7,7,6 49,1,4 50,3,1
1,2,4,4,2,3,5,5 4,5,8,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,7,6,7,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,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

解题代码

/*ID: 15189822PROG: comboLANG: C++*/#include<iostream>#include<fstream>#include<cmath>using namespace std;ifstream fin("combo.in");ofstream fout("combo.out");int a,b,c,d,e,f,N;bool res(int m,int n){    if (abs(m-n)<=2||abs(m-n)>=N-2) return true;    return false;}int main(){    fin>>N;    fin>>a>>b>>c>>d>>e>>f;    int i,j,k,f1,f2,f3,f4,r=0;    for (i=1;i<=N;i++){        f1=0;f2=0;        if (!res(i,a)&&!res(i,d)) continue;        if (res(i,a)) f1=1;        if (res(i,d)) f2=1;        for (j=1;j<=N;j++){            f3=0;f4=0;            if (!res(j,b)&&!res(j,e)) continue;            if (res(j,b)) f3=1;            if (res(j,e)) f4=1;            for (k=1;k<=N;k++){                if (f1&&f3&&res(k,c))  r++;                else if (f2&&f4&&res(k,f))  r++;            }        }    }    fout<<r<<endl;    return 0;}