java语言程序设计基础篇——多维数组(1)

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要注意更新,即将sumOfRsumOfCisSame在第一层循环下定义并初始化。如果isSame的值一直为真,则说明存在相同值,需要再设置一个标志值判断isSame是否为真,最终得出每一行和每一列有没有相同的元素。

2. 求主对角线上各元素的和sumOfM+=f[i][i];

求副对角线上各元素的和sumOfS+=f[i][size-1-i];

和为0表示具有相同的元素0

和为元素个数,则说明具有相同的元素1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值