遇事不决,直接暴力
题目描述
农夫约翰的奶牛们总是偷偷的逃出他的农场,去外面为非作歹。
农夫约翰为了防止它们私自逃离农场,购买了一个密码锁,以此阻止奶牛们打开农场大门。
约翰知道他的奶牛们都非常聪明,因此他想要确保它们不能通过简单的尝试一些密码组合,就轻易的将锁打开。
锁具上有三个密码拨盘,每个拨盘上的数字为 1…N,其中 1 和 N相邻(因为拨盘是圆形的)。
一共有两种可以打开密码锁的数字组合,一组是约翰设置的密码组合,一组是制造商设置的密码组合。
这种锁具有一定的容错性,只要三个表盘上的数字与任意一组正确密码组合的对应位置数字相距两个位置以内,锁均会打开。
例如,假设约翰设置的密码组合是 (1,2,3),制造商设置的密码组合是 (4,5,6)。
此时我们输入组合 (1,3,5)就可以将锁打开,因为这与约翰设置的密码接近,输入组合 (2,4,8)也可以将锁打开,因为这与制造商设置的密码接近。
但是,如果我们输入组合 (1,5,6)
就不能将锁打开,因为它和两个密码都不接近。
现在给定你两个设置好的密码,请你判断一共有多少种密码组合可以将锁打开。
注意,密码组合是有序的,因此 (1,2,3)和 (3,2,1)是两种不同的组合。
样例
输入格式
第一行包含整数 N
。
第二行包含三个整数,表示约翰设置的密码组合。
第三行包含三个整数,表示制造商设置的密码组合。
输出格式
输出一个整数,表示可以打开锁的密码组合数量。
数据范围
1≤N≤100
输入样例:
50
1 2 3
5 6 7
输出样例:
249
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, ans = 0;
cin >> n;
vector<int> farmer(3);
vector<int> facture(3);
cin >> farmer[0] >> farmer[1] >>farmer[2];
cin >> facture[0] >> facture[1] >> facture[2];
for(int i = 1; i < n + 1; ++i)
{
int ffarmer = abs(farmer[0] - i) >= n - 2 ? 0 : abs(farmer[0] - i);
int ffacture = abs(facture[0] - i) >= n - 2 ? 0 : abs(facture[0] - i);
// if(i > farmer[0] + 2 && i > facture[0] + 2) break; // 这里不能剪枝,因为1跟N相差1(这是个环)
if(ffarmer - i > 2 && ffacture > 2) continue;
for(int j = 1; j < n + 1; ++j)
{
int sfarmer = abs(farmer[1] - j) >= n - 2 ? 0 : abs(farmer[1] - j);
int sfacture = abs(facture[1] - j) >= n - 2 ? 0 : abs(facture[1] - j);
// if(j > farmer[1] + 2 && j > facture[1] + 2) break;
if(sfarmer > 2 && sfacture > 2) continue;
for(int k = 1; k < n + 1; ++k)
{
// if(k > farmer[2] + 2 && k > facture[2] + 2) break;
int tfarmer = abs(farmer[2] - k) >= n - 2 ? 0 : abs(farmer[2] - k);
int tfacture = abs(facture[2] - k) >= n - 2 ? 0 : abs(facture[2] - k);
if( ffarmer <=2 && sfarmer <= 2 && tfarmer <= 2 || ffacture <= 2 && sfacture <= 2 && tfacture <= 2)
++ans;
}
}
}
cout << ans << endl;
return 0;
}