usingnamespacestd; constint N = 3; int a[N], b[N]; int n;
boolcheck(int i, int j, int k) { int res_a = 0, res_b = 0; int c[3] = {i, j, k}; for(int i = 0; i < 3; i++) { if (abs(a[i] - c[i]) <= 2 || n - abs(a[i] - c[i]) <= 2) res_a ++; if (abs(b[i] - c[i]) <= 2 || n - abs(b[i] - c[i]) <= 2) res_b ++; } return res_a == 3 || res_b == 3; }
intmain() { cin >> n; for(int i = 0; i < 3; i++) cin >> a[i]; for(int i = 0; i < 3; i++) cin >> b[i];
int res = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) for(int k = 1; k <= n; k++) if (check(i, j, k)) res ++; cout << res << endl; return0; }
算法2:$O(1)$
数学方法:
对于一个密码当n大于5时每个位置最多有5个数可以进行匹配,那么一共就是$5^3$。
所以一共最多就 $ 2 * 5^3 $
此时再去掉是a又是b的密码就行。
进行讨论:
当a, b 在同一位置上时。 需要减去 5
当a, b 相差 1 时。需要减去 4
当a, b 相差 2 时。需要减去 3
当a, b 相差 3 时。需要减去 2
当a, b 相差 4 时。需要减去 1
当a, b 相差 5 时。减去 0;