十二届蓝桥杯省赛真题E题—路径
蓝桥填空题比较好的地方就是可以直接暴力循环,不用优化算法,不用担心超时
题解:
public class 路径 {
static final int n = 2021;
//最小公约数
static int gcd(int a,int b) {
return b == 0? a : gcd(b,a%b);
}
//最小公倍数
static int lcm(int a,int b) {
return a*b/gcd(a,b);
}
public static void main(String[] args) {
//1.记录各个点之间的距离,大于21的为0
int[][] floyd = new int[n][n];//下标代表两个结点,floyd[][]代表两个节点间距离
for(int i = 0;i < n;i++)
for(int j = i+1;j < n;j++)
if(j <= i+21)
floyd[i][j] = floyd[j][i] = lcm(i+1,j+1);
//暴力循环
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++)
for(int k = 0;k < n;k++)
//把最小长度赋值给floyd[][]
if(floyd[i][j] != 0 && floyd[j][k] != 0 && (floyd[i][k] == 0 || floyd[i][k] > floyd[i][j]+floyd[j][k]))
floyd[i][k] = floyd[i][j] + floyd[j][k];
System.out.println(floyd[0][n-1]);
}
}