C组试题重复的不做整理
((55条消息) 蓝桥杯12省赛真题_java.C组试题学习_Allstruct的博客-CSDN博客)
public int requireDirectLine(int x,int y) {
Test5 test5 = new Test5();
int arr[][] =new int[x][y];
HashSet<String> set = new HashSet<>();
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[0].length; j++) {
//取双重for循环为一个点,即(i,j),另外的双重for循环为另外一个点,即(p,q)
for(int p = 0; p < arr.length; p++ ) {
for(int q = 0; q < arr[0].length; q++) {
if( i == p && j ==q ) { //这一步判断可以不要
continue;
}
if( i != p) { //x1 == x2时直线斜率不存在,即当直线垂直于x轴时,直线斜率不存在。
String line = "";
int u = q - j; //y2-y1
int d = p - i; //x2-x1
int g = gcd(u,d); //u、d的最大公约数
line = line + u/g+ "/"+ d/g + "+"; //(y2-y1)/(x2-x1) k = u/g+ "/"+ d/g
int b = j * d - u *i;
// y = kx +b -> b = y - kx 将点(i,j),k=(y2-y1)/x2-x1代入。
// 可得b= (y0(x2-x1)- x0(y2-y1))/x2-x1
//即求除数与被除数的最大公约数就可以求出该直线的最简式,最简式一样即两条直线是同一条直线。
int g2 = gcd(b,d); //求 y0(x2-x1) - x0(y2-y1))/x2-x1 的最大公约数
line = line + b/g2 + "/" + d/g2; // 直线 为 kx + b ,k、b不一致,将直线加入set。
set.add(line);
}
}
}
}
}
if( y == 1) { //当y为1时,即只有一行,这时无需加上垂直的直线,即垂直与x坐标轴的值。
return set.size();
}
return set.size() + x; //加上斜率不存在的直线。即横坐标的值。
}
//辗转相除法求最大公约数-->递归方式
public int gcd(int x,int y){
if( y == 0){
return x;
}
return gcd(y,x%y);
}
知识点:直线的表示,hashset去重,hashcode查表
((53条消息) 深入理解HashSet去重原理_留乘船的博客-CSDN博客_hashset)
((53条消息) 必须掌握的hashcode()方法_Java笔记虾的博客-CSDN博客)
(53条消息) 2021年 第12届 蓝桥杯 Java B组 省赛真题第一场——货物摆放_码界猿候的博客-CSDN博客_蓝桥杯货物摆放
(54条消息) 第十二届蓝桥杯JavaB组省赛-回路计数_清梦2020的博客-CSDN博客
(56条消息) 第十二届蓝桥杯Java省赛A组试题:异或数列_叶绿体不忘呼吸的博客-CSDN博客(不太明白)
蓝桥杯 - 分果果 - XeRiVO - 博客园 (cnblogs.com)(看不懂)
(56条消息) 第十二届蓝桥杯大赛软件类省赛Java研究生组-题解_nuist__NJUPT的博客-CSDN博客_南京邮电大学第十二届蓝桥杯