算法1
(暴力枚举) $O(n^3)$
三重循环枚举三位密码,如果check成功,ans++,最后输出ans
check函数:
两个数之间的距离有两种可能
第一种:他们之间的直线距离,比如30和20之间就是10,这种情况比较好做,只需要取两个数差的绝对值就可以了
第二种:第一种方法有明显的弊端,比如49和1,直接取差的话就是48,可是由于圆盘是圆形的,所以他们的实际距离是2,这是怎么算的呢?首先先取两个数的最大值,
再用n减,最后再加上两个数的最小值,比如1,49,就是50-49+1=2
然后再这两种方法之间取距离最小值就可以了
最后判断每位与正确的两个密码的差是否小于等于2就可以了
C++ 代码
无注释代码
#include <iostream>
#include <cmath>
using namespace std;
int n,a,b,c,d,e,f,ans;
bool check(int x,int y,int z){
int da=min(abs(x-a),n-max(x,a)+min(x,a));
int db=min(abs(y-b),n-max(y,b)+min(y,b));
int dc=min(abs(z-c),n-max(z,c)+min(z,c));
int dd=min(abs(x-d),n-max(x,d)+min(x,d));
int de=min(abs(y-e),n-max(y,e)+min(y,e));
int df=min(abs(z-f),n-max(z,f)+min(z,f));
if((da<=2 && db<=2 && dc<=2) || (dd<=2 && de<=2 && df<=2)) return true;
return false;
}
int main(){
cin >> n;
cin >> a >> b >> c;
cin >> d >> e >> f;
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)){
ans++;
}
}
}
}
cout << ans << endl;
return 0;
}
如果数据比较大的话就只能用数论了