USACO - Chapter1 Section 1.3 - Combination Lock

Combination Lock

題目描述

農夫約翰的奶牛不停地從他的農場中逃出來,導致了很多損害。爲了防止它們再逃出來,他買了一隻很大的號碼鎖以防止奶牛們打開牧場的門。

農夫約翰知道他的奶牛很聰明,所以他希望確保它們不會在簡單地試了很多不同的號碼組合之後就能輕易開鎖。鎖上有三個轉盤,每個上面有數字1..N (1 <= N <= 100),因爲轉盤是圓的,所以1和N是相鄰的。有兩種能開鎖的號碼組合,一種是農夫約翰設定的,還有一種“預設”號碼組合是鎖匠設定的。但是,鎖有一定的容錯性,所以,在每個轉盤上的數字都與一個合法的號碼組合中相應的數字相距兩個位置以內時,鎖也會打開。

比如說,如果農夫約翰的號碼組合是(1,2,3),預設號碼組合是(4,5,6),在轉盤被設定爲(1,4,5)(因爲這和農夫約翰的號碼組合足夠接近)或(2,4,8)(因爲這和預設號碼組合足夠接近)。注意,(1,5,6)並不會打開鎖,因爲它與任一號碼組合都不夠接近。

給出農夫約翰的號碼組合和預設號碼組合,請計算能夠開鎖的不同的號碼組合的數目。號碼是有序的,所以(1,2,3)與(3,2,1)不同。

輸入輸出格式

輸入格式:
第一行:整數N。

第二行:三個以空格分隔的整數,爲農夫約翰的號碼組合。

第三行:三個以空格分隔的整數,爲預設號碼組合(可能與農夫約翰的號碼組合相同)。

輸出格式:
第一行:所有不同的能夠開鎖的號碼組合的總數。

輸入輸出樣例

輸入樣例#1:
50
1 2 3
5 6 7
輸出樣例#1:
249

模擬,注意不要在滿足兩種情況的時候計數兩次。

Code

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    int n,a[3],b[3],ans = 0;
    cin >> n >> a[0] >> a[1] >> a[2] >> b[0] >> b[1] >> b[2];

    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=n;j++)
        {
            for (int k=1;k<=n;k++)
            {
                if (   (abs(a[0]-i) <= 2 || (i+n-a[0])<=2 || ((n-i+a[0])<=2))
                    && (abs(a[1]-j) <= 2 || (j+n-a[1])<=2 || ((n-j+a[1])<=2))
                    && (abs(a[2]-k) <= 2 || (k+n-a[2])<=2 || ((n-k+a[2])<=2)))
                {
                    ans++;
                    continue;
                }
                if (   (abs(b[0]-i) <= 2 || (i+n-b[0])<=2 || ((n-i+b[0])<=2))
                    && (abs(b[1]-j) <= 2 || (j+n-b[1])<=2 || ((n-j+b[1])<=2))
                    && (abs(b[2]-k) <= 2 || (k+n-b[2])<=2 || ((n-k+b[2])<=2))   )
                {
                    ans++;
                    continue;
                }
            }
        }
    }
    cout << ans;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章