import java.util.Scanner;
public class Exercise8_8 {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("Enter the number of points: ");
int numberOfPoints = input.nextInt();
double[][] points = new double[numberOfPoints][numberOfPoints];
System.out.print("Enter "+numberOfPoints +" points: ");
for(int i=0;i<points.length;i++){
points[i][0] = input.nextDouble();
points[i][1] = input.nextDouble();
}
int p1 = 0,p2 = 1;
double shortestDistance = distance(points[p1][0],points[p1][1],points[p2][0],points[p2][0]);
int[][] closestPairs = new int[points.length][2];
int k = 0;
for(int i=0;i<points.length;i++){
for(int j=i+1;j<points.length;j++){
double distance = distance(points[i][0],points[i][1],points[j][0],points[j][1]);
if(shortestDistance > distance){
closestPairs[k][0] = i;
closestPairs[k][1] = j;
shortestDistance = distance;
}else if(shortestDistance == distance){
closestPairs[k][0] = i;
closestPairs[k][1] = j;
k++;
}
}
}
for(int i=0;i<k;i++){
p1 = closestPairs[i][0];
p2 = closestPairs[i][1];
System.out.println("The closest two points are ("+points[p1][0]+","+points[p1][1]+") and ("+points[p2][0]+","+points[p2][1]+")");
}
System.out.print("Their distance is "+shortestDistance);
}
private static double distance(double x1,double y1,double x2,double y2) {
// TODO Auto-generated method stub
return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
}
设置数组cloestPairs[][]用来存储具有相同最小距离的点对的下标值,k用来统计符合条件的点对的个数
在输出结果的时候,将下标赋值给p1和p2
和8-3比,主要是最小距离点对的下标值存储问题,由单个不断更新的p1、p2,转化成数组存储最后还是依靠p1、p2进行输出
public class Exercise8_10 {
public static void main(String[] args){
final int N = 4;
int[][] f = new int[N][N];
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
f[i][j] = (int) (Math.random()*2);
System.out.print(f[i][j]);
}
System.out.println();
}
int rowIndex = 0,columnIndex = 0;
int rowMax = 0,columnMax = 0;
int[] r = new int[N];
int[] c = new int[N];
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
r[i]+=f[i][j];
}
}
for(int i=0;i<N;i++){
if(r[i]>rowMax){
rowMax = r[i];
rowIndex = i;
}
}
System.out.println("The largest row index: "+rowIndex);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
c[i]+=f[j][i];
}
}
for(int i=0;i<N;i++){
if(c[i]>columnMax){
columnMax = c[i];
columnIndex = i;
}
}
System.out.println("The largest column index: "+columnIndex);
}
}
思路简单,只是比较繁琐。
通过双层for循环计算出各行元素的和(即为1的个数)存储进数组r[]中,同理计算各列元素和存储进c[]中
再次通过for单层循环对r[]和c[]分别进行元素比较,找到最大的元素值,并记录该最大值第一次出现的位置进输出
import java.util.Scanner;
public class Exercise8_14 {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("Enter the size for the matrix: ");
int size = input.nextInt();
int[][] f= new int[size][size];
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
f[i][j] = (int) (Math.random()*2);
System.out.print(f[i][j]);
}
System.out.println();
}
boolean isSameOnRow=false,isSameOnColumn=false;
for(int i=0;i<size;i++){
int sumOfR=0;
boolean isSame=true;
for(int j=0;j<size;j++){
sumOfR+=f[i][j];
}
if(sumOfR == 0)
System.out.println("All 0S on row "+i);
else if(sumOfR == size)
System.out.println("All 1s on row "+i);
else
isSame=false;
if(isSame)
isSameOnRow=true;
}
if(!isSameOnRow)
System.out.println("No same numbers on a row");
for(int i=0;i<size;i++){
int sumOfC=0;
boolean isSame=true;
for(int j=0;j<size;j++){
sumOfC+=f[j][i];
}
if(sumOfC == 0)
System.out.println("All 0S on column "+i);
else if(sumOfC == size)
System.out.println("All 1s on column "+i);
else
isSame=false;
if(isSame)
isSameOnColumn=true;
}
if(!isSameOnColumn)
System.out.println("No same numbers on a column");
int sumOfM=0;
for(int i=0;i<size;i++){
sumOfM+=f[i][i];
}
if(sumOfM == 0)
System.out.println("All 0S on major diagonal");
else if(sumOfM == size)
System.out.println("All 1s on major diagonal");
else
System.out.println("No same numbers on the major diagonal");
int sumOfS=0;
for(int i=0;i<size;i++){
sumOfS+=f[i][size-1-i];
}
if(sumOfS == 0)
System.out.println("All 0S on sub-diagonal");
else if(sumOfS == size)
System.out.println("All 1s on sub-diagonal");
else
System.out.println("No same numbers on the sub-diagonal");
}
}
1. 求每一列各元素的和:sumOfR+=f[i][j];
求每一行各元素的和:sumOfC+=f[j][i];
每一行和每一列的和以及标志值isSame要注意更新,即将sumOfR、sumOfC和isSame在第一层循环下定义并初始化。如果isSame的值一直为真,则说明存在相同值,需要再设置一个标志值判断isSame是否为真,最终得出每一行和每一列有没有相同的元素。
2. 求主对角线上各元素的和:sumOfM+=f[i][i];
求副对角线上各元素的和:sumOfS+=f[i][size-1-i];
和为0表示具有相同的元素0;
和为元素个数,则说明具有相同的元素1
