Java、探索矩阵

        编写程序,提示用户输入一个方阵的长度,随机地在矩阵中填入0和1,打印这个矩阵,然后找出整行、整列或者对角线都是1或0的行、列和对角线。


package pack2;

import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class ExplorationOfMatrix {

	public static void main(String[] args) {
		explorationOfMatrix();
	}

	/**探索矩阵*/
	public static void explorationOfMatrix() {
		try(Scanner input = new Scanner(System.in);) {
			System.out.print("Enter the size for the matrix: ");
			int size = input.nextInt();
			
			int[][] matrix = new int[size][size];
			initial(matrix);
			printMatrix(matrix);
			
			System.out.print(getMessge(matrix));
			System.out.println(getMessageFoeMajorAndSubDiagonal(matrix));
		}
	}
	
	/**获取信息*/
	public static String getMessge(int[][] matrix) {
		StringBuffer message = new StringBuffer();
		int rowSum, columnSum;	//行、列和
		rowSum = columnSum = 0;
		
		for (int i = 0; i < matrix.length; i++) {
			rowSum = columnSum = 0;	//每次循环置为0
			
			for (int j = 0; j < matrix[i].length; j++) {
				rowSum += matrix[i][j];
				columnSum += matrix[j][i];
			}
			
			if(rowSum == 0) message.append("All 0s on row " + i + "\n");	//全0行
			if(rowSum == matrix[0].length) message.append("All 1s on row " + i + "\n");	        
                     //全1行
			
			if(columnSum == 0) message.append("All 0s on column " + i + "\n");	//全0列
			if(columnSum == matrix.length) message.append("All 1s on column " + i 
                    + "\n");	//全1列
		}
		
		if(message.indexOf("row") == -1)	//不存在整行为0或1时
			message.append("No same numbers on a row\n");
		if(message.indexOf("column") == -1)	//不存在整列为0或1时
			message.append("No same numbers on a column\n");
		
		return message.toString();
	}
	
	/**获取对角线信息*/
	public static String getMessageFoeMajorAndSubDiagonal(int[][] matrix) {
		StringBuffer message = new StringBuffer();
		int majorDiagonal, subDiagonal;	//主、次对角线和
		majorDiagonal = subDiagonal = 0;
		
		for (int i = 0, k = matrix.length - 1; i < matrix.length; i++, k--) {
			majorDiagonal += matrix[i][i];
			subDiagonal += matrix[i][k];
		}
		
             //主对角线全0时
		if(majorDiagonal == 0) message.append("All 0s on the major diagonal");	
		else if(majorDiagonal == matrix.length) message.append(
                "All 1s on the major diagonal");	//主对角线全1时
		else message.append("No same numbers on the major diagonal");//主对角线非全0全1时
		message.append("\n");
		
		if(subDiagonal == 0) message.append("All 0s on the sub-diagonal");//次对角线全0时
		else if(subDiagonal == matrix.length) message.append(
                "All 1s on the sub-diagonal");	//次对角线全0时
		else message.append("No same numbers on the sub-diagonal");	//次对角线非全0全1时
		
		return message.toString();
	}

	/**随机赋值矩阵*/
	public static void initial(int[][] matrix) {
		for (int i = 0; i < matrix.length; i++) 
			for (int j = 0; j < matrix[i].length; j++) 
				matrix[i][j] = new SecureRandom().nextInt(2);
	}
	
	/**打印矩阵*/
	public static void printMatrix(int[][] matrix) {
		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix[i].length; j++) 
				System.out.print(" " + matrix[i][j]);
			
			System.out.println();
		}
	}
}

 


package test;

import java.security.SecureRandom;
import java.util.*;

/**
 * @create: 2023/3/25
 * @Description:
 * @FileName: Main
 */
public class Main {
    public static void main(String[] args) {
        int n = 4;
        int[][] matrix = initiate(n);
        print(matrix);

        // 行和列
        List<List<Integer>> list = count(matrix);
        System.out.println("全0/1行:" + list.get(0));
        System.out.println("全0/1列:" + list.get(1));

        // 主次对角线
        boolean[] diagonals = diagonal(matrix);
        System.out.println("主对角线:" + diagonals[0]);
        System.out.println("次对角线:" + diagonals[1]);
    }

    /** 初始化矩阵 */
    private static int[][] initiate(int n) {
        int[][] matrix = new int[n][n];
        SecureRandom random = new SecureRandom();

        // 矩阵赋值
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = random.nextInt(2);
            }
        }
        return matrix;
    }

    /** 返回全0/1的行和列的数目 */
    private static List<List<Integer>> count(int[][] matrix) {
        List<List<Integer>> list = new ArrayList<>();
        list.add(new ArrayList<>(matrix.length));   // 行
        list.add(new ArrayList<>(matrix.length));   // 列

        for (int i = 0; i < matrix.length; i++) {
            // 使用集合对行列数据计数(集合内元素不重复)
            Set<Integer> rowCount = new HashSet<>(matrix.length);
            Set<Integer> columnCount = new HashSet<>(matrix.length);
            // 集合添加元素
            for (int j = 0; j < matrix.length; j++) {
                rowCount.add(matrix[i][j]);
                columnCount.add(matrix[j][i]);
            }

            // 集合大小为1时,存在全0/1的行/列
            if (1 == rowCount.size())
                list.get(0).add(i);
            if (1 == columnCount.size())
                list.get(1).add(i);
        }
        return list;
    }

    /** 返回主次对角线 */
    private static boolean[] diagonal(int[][] matrix) {
        boolean[] diagonal = new boolean[2];    // 0: 主对角线  1:次对角线
        Set<Integer> major = new HashSet<>();   // 主对角线集合
        Set<Integer> sub = new HashSet<>();     // 次对角线集合

        // 集合添加主次对角线元素
        for (int i = 0; i < matrix.length; i++) {
            major.add(matrix[i][i]);
            sub.add(matrix[i][matrix.length - 1 - i]);
        }

        // 判断集合大小,等于1表示存在全0/1
        diagonal[0] = (1 == major.size());
        diagonal[1] = (1 == sub.size());
        return diagonal;
    }

    /** 打印矩阵 */
    private static void print(int[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                System.out.printf("%5d", matrix[i][j]);
            }
            System.out.println();
        }
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值