• Java编程练习题:Demo96 - Demo105(多维数组)


    目录

    Demo96. (代数方面:两个矩阵相乘)编写两个矩阵相乘的方法。

    Demo97. (距离最近的两个点)程序清单8-3给出找到二维空间中距离最近的两个点的程序。 修改该程序,让程序能够找出在三维空间上距离最近的两个点。

    Demo98. (最大的行和列)编写一个程序,在一个4×4的矩阵中随机填人0和1, 打印该矩阵,找到第一个具有最多1的行和列。

    Demo99. (游戏:九个正面和背面) 编写一个程序,提示用户输入一个在0到511之间的数字,然后显示用字符H和T表示的对应的矩阵。

    Demo100. (模式识别:连续的四个相等的数)编写下面的方法,测试一个二维数组是否有四个连续的数字具有相同的值, 这四个数可以是水平方向的、垂直方向的或者对角线方向的。

    Demo101. (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏中, 玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中,如下所示。 这个游戏的目的是在对手实现一行、一列或者一条对角线上有四个相同颜色的棋子之前, 你能先做到。

    Demo102. (马尔科夫矩阵)一个n×n的矩阵被称为一个正马尔科夫矩阵,当且仅当每个元素都是正数, 并且每列的元素的和为1。编写下面的方法来检测一个矩阵是否是一个马尔科夫矩阵。

    Demo103. (几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积

    Demo104. (几何:多边形的子面积)一个具有四个顶点的凸多边形被分为四个三角形,编写一个程序,提示用户输入四个顶点的坐标,然后以升序显示四个三角形的面积。

    Demo105. (拉丁正方形)拉丁正方形是一个n×n的数组,由n个不同的拉丁字母填充,每个拉丁字母恰好只在每行和每列中出现一次。编写一个程序,提示用户输人数字n以及字符数组,如示例输出所示,检测该输出数组是否是一个拉丁正方形。字符是从A开始的前面n个字符。


    Demo96. (代数方面:两个矩阵相乘)编写两个矩阵相乘的方法。

    方法头如下: public static double[][] multiplyMatrix(double[][] a,double[][] b) 为了使矩阵a能够和矩阵b相乘,矩阵a的列数必须与矩阵b的行数相同,并且两个矩阵的元素要具有相同或兼容的数据类型。 假设矩阵c是相乘的结果,而a的列数是n,那么每个元素cij就是ai1 x b1j + ai2 x b2j +…+ ain x bnj。 例如,对于两个3×3的矩阵a和 b,c就有: cij = ai1 x b1j + ai2 x b2j + ai3 x b3j。 编写一个测试程序,提示用户输人两个3×3的矩阵,然后显示它们的乘积。下面是一个运行示例:

    1. package Exer2;
    2. import java.math.BigDecimal;
    3. import java.text.DecimalFormat;
    4. import java.util.Scanner;
    5. public class Demo96 {
    6. /*
    7. (代数方面:两个矩阵相乘)编写两个矩阵相乘的方法。方法头如下:
    8. public static double[][] multiplyMatrix(double[][] a,double[][] b)
    9. 为了使矩阵a能够和矩阵b相乘,矩阵a的列数必须与矩阵b的行数相同,并且两个矩阵的元素要具有相同或兼容的数据类型。
    10. 假设矩阵c是相乘的结果,而a的列数是n,那么每个元素cij就是ai1 x b1j + ai2 x b2j +…+ aim x bnj。
    11. 例如,对于两个3×3的矩阵a和 b,c就有: cij = ai1 x b1j + ai2 x b2j + ai3 x b3j。
    12. 编写一个测试程序,提示用户输人两个3×3的矩阵,然后显示它们的乘积。下面是一个运行示例:
    13. 1 2 3 4 5 6 7 8 9
    14. 0 2 4 1 4.5 2.2 1.1 4.3 5.2
    15. */
    16. public static void main(String[] args) {
    17. Scanner scan = new Scanner(System.in);
    18. System.out.print("Enter matrix1:");
    19. double[][] a = new double[3][3];
    20. for (int i = 0; i < a.length; i++) {
    21. for (int j = 0; j < a[i].length; j++) {
    22. a[i][j] = scan.nextDouble();
    23. }
    24. }
    25. double[][] b = new double[3][3];
    26. System.out.print("Enter matrix2:");
    27. for (int i = 0; i < b.length; i++) {
    28. for (int j = 0; j < b[i].length; j++) {
    29. b[i][j] = scan.nextDouble();
    30. }
    31. }
    32. System.out.println("The multiplication of the matrices is:");
    33. for (int i = 0; i < a.length; i++) {
    34. for (int j = 0; j < a[0].length; j++) {
    35. System.out.print(new DecimalFormat("#.##").format(a[i][j]) + "\t");
    36. }
    37. System.out.print(i == 1 ? "\t+\t" : "\t\t");
    38. for (int j = 0; j < a[0].length; j++) {
    39. System.out.print(new DecimalFormat("#.##").format(b[i][j]) + "\t");
    40. }
    41. System.out.print(i == 1 ? "\t=\t" : "\t\t");
    42. for (int j = 0; j < a[0].length; j++) {
    43. // new DecimalFormat("#.##").format(double d) 让小数点后为0的显示为整数,不为零的显示为double
    44. System.out.print(new DecimalFormat("#.##").format(multiplyMatrix(a, b)[i][j]) + "\t");
    45. }
    46. System.out.println();
    47. }
    48. scan.close();
    49. }
    50. public static double[][] multiplyMatrix(double[][] a, double[][] b){
    51. double[][] c = new double[3][3];
    52. for (int i = 0; i < c.length; i++) {
    53. for (int j = 0; j < c[i].length; j++) {
    54. c[i][j] = BigDecimal.valueOf(a[i][0]).multiply(BigDecimal.valueOf(b[0][j]))
    55. .add(BigDecimal.valueOf(a[i][1]).multiply(BigDecimal.valueOf(b[1][j]))
    56. .add(BigDecimal.valueOf(a[i][2]).multiply(BigDecimal.valueOf(b[2][j]))))
    57. .doubleValue();
    58. }
    59. }
    60. return c;
    61. }
    62. }

    结果:

    Demo97. (距离最近的两个点)程序清单8-3给出找到二维空间中距离最近的两个点的程序。 修改该程序,让程序能够找出在三维空间上距离最近的两个点。

    使用一个二维数组表示这些点。使用下面的点来测试这个程序: double[][] points = {{-1,0,3},{-1,-1,-1},{4,1,1},{2,0.5,9},{3.5,2,-1},{3,1.5,3},{-1.5,4,2},{5.5,4,-0.5}}; 计算两个点(x1,y1,z1)和(x2,y2,z2)之间距离的公式是√((x2-x1)²+(y2-y1)²+(z2-z1)²)。

    1. package Exer2;
    2. public class Demo97 {
    3. /*
    4. (距离最近的两个点)程序清单8-3给出找到二维空间中距离最近的两个点的程序。
    5. 修改该程序,让程序能够找出在三维空间上距离最近的两个点。使用一个二维数组表示这些点。使用下面的点来测试这个程序:
    6. double[][] points = {{-1,0,3},{-1,-1,-1},{4,1,1},{2,0.5,9},{3.5,2,-1},{3,1.5,3},{-1.5,4,2},{5.5,4,-0.5}};
    7. 计算两个点(x1,y1,z1)和(x2,y2,z2)之间距离的公式是√((x2-x1)²+(y2-y1)²+(z2-z1)²)。
    8. */
    9. public static void main(String[] args) {
    10. double[][] points = {{-1, 0, 3}, {-1, -1, -1}, {4, 1, 1}, {2, 0.5, 9},
    11. {3.5, 2, -1}, {3, 1.5, 3}, {-1.5, 4, 2}, {5.5, 4, -0.5}};
    12. // System.out.println(Arrays.deepToString(minDistance(points)));
    13. System.out.printf("距离最近的两个点为:(%s, %s, %s), (%s, %s, %s)%n",
    14. minDistance(points)[0][0], minDistance(points)[0][1], minDistance(points)[0][2],
    15. minDistance(points)[1][0], minDistance(points)[1][1], minDistance(points)[1][2]);
    16. }
    17. private static double[][] minDistance(double[][] points) {
    18. double[][] twoPoints = new double[2][3];
    19. double minD = Double.MAX_VALUE;
    20. for (int i = 0; i < points.length - 1; i++) {
    21. for (int j = i + 1; j < points.length; j++) {
    22. double d = Math.sqrt(Math.pow(points[j][0] - points[i][0], 2)
    23. + Math.pow(points[j][1] - points[i][1], 2) + Math.pow(points[j][1] - points[i][1], 2));
    24. if (d < minD) {
    25. minD = d;
    26. twoPoints[0] = points[i];
    27. twoPoints[1] = points[j];
    28. }
    29. }
    30. }
    31. return twoPoints;
    32. }
    33. }

    结果:

    Demo98. (最大的行和列)编写一个程序,在一个4×4的矩阵中随机填人0和1, 打印该矩阵,找到第一个具有最多1的行和列。

    下面是一个程序的运行示例:

    1. package Exer2;
    2. import java.util.Random;
    3. public class Demo98 {
    4. /*
    5. (最大的行和列)编写一个程序,在一个4×4的矩阵中随机填人0和1,
    6. 打印该矩阵,找到第一个具有最多1的行和列。下面是一个程序的运行示例:
    7. 0011
    8. 0011
    9. 1101
    10. 1010
    11. The largest row index:2
    12. The largest column index:2
    13. */
    14. public static void main(String[] args) {
    15. int[][] nums = new int[4][4];
    16. for (int i = 0; i < nums.length; i++) {
    17. for (int j = 0; j < nums[i].length; j++) {
    18. nums[i][j] = new Random().nextInt(2);
    19. }
    20. }
    21. for (int[] arr : nums) {
    22. for (int num : arr) {
    23. System.out.print(num + " ");
    24. }
    25. System.out.println();
    26. }
    27. int rowIndex = 0, columnIndex = 0;
    28. int largestRow = 0;
    29. int largestColumn = 0;
    30. // int[][] largest = new int[2][2];
    31. for (int i = 0; i < nums.length; i++) {
    32. int rowSum = 0, ColumnSum = 0;
    33. for (int j = 0; j < nums[i].length; j++) {
    34. rowSum += nums[i][j];
    35. ColumnSum += nums[j][i];
    36. if (ColumnSum > largestColumn) {
    37. columnIndex = j;
    38. largestColumn = ColumnSum;
    39. }
    40. }
    41. if (rowSum > largestRow) {
    42. rowIndex = i;
    43. largestRow = rowSum;
    44. }
    45. }
    46. System.out.println("The largest row index:" + rowIndex);
    47. System.out.println("The largest column index:" + columnIndex);
    48. }
    49. }

    结果:

    Demo99. (游戏:九个正面和背面) 编写一个程序,提示用户输入一个在0到511之间的数字,然后显示用字符H和T表示的对应的矩阵。

    一个3×3的矩阵中放置了9个硬币,这些硬币有些面向上,有些面向下。 可以使用3×3的矩阵中的0(正面)或1(反面)表示硬币的状态。下面是一些例子:

    每个状态都可以使用一个二进制数表示。例如,前面的矩阵对应到数字: 000010000 101001100 110100001 101110100 100111110 总共会有512种可能性。所以,可以使用十进制数0,1,2,3,...,511来表示这个矩阵的所有状态。下面是一个运行示例:

    1. package Exer2;
    2. import java.util.Scanner;
    3. public class Demo99 {
    4. /*
    5. (游戏:九个正面和背面)一个3×3的矩阵中放置了9个硬币,这些硬币有些面向上,有些面向下。
    6. 可以使用3×3的矩阵中的0(正面)或1(反面)表示硬币的状态。下面是一些例子:
    7. 0 0 0 1 0 1 1 1 0 1 0 1 1 0 0
    8. 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1
    9. 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0
    10. 每个状态都可以使用一个二进制数表示。例如,前面的矩阵对应到数字:
    11. 000010000 101001100 110100001 101110100 100111110
    12. 总共会有512种可能性。所以,可以使用十进制数0,1,2,3,...,511来表示这个矩阵的所有状态。
    13. 编写一个程序,提示用户输入一个在0到511之间的数字,然后显示用字符H和T表示的对应的矩阵。下面是一个运行示例:
    14. */
    15. public static void main(String[] args) {
    16. Scanner scan = new Scanner(System.in);
    17. System.out.print("Enter a number between 0 and 511:");
    18. int number = scan.nextInt();
    19. int[][] binaryArr = toBinaryArr(number);
    20. // System.out.println(Arrays.deepToString(binaryArr));
    21. for (int[] nums : binaryArr) {
    22. for (int n : nums) {
    23. if (n == 0) {
    24. System.out.print("H ");
    25. } else {
    26. System.out.print("T ");
    27. }
    28. }
    29. System.out.println();
    30. }
    31. scan.close();
    32. }
    33. private static int[][] toBinaryArr(int number) {
    34. int[][] arr = new int[3][3];
    35. for (int i = arr.length - 1; i >= 0; i--) {
    36. for (int j = arr[i].length - 1; j >= 0; j--) {
    37. if (number > 0) {
    38. arr[i][j] = number % 2;
    39. number /= 2;
    40. }
    41. }
    42. }
    43. return arr;
    44. }
    45. }

     结果:

    Demo100. (模式识别:连续的四个相等的数)编写下面的方法,测试一个二维数组是否有四个连续的数字具有相同的值, 这四个数可以是水平方向的、垂直方向的或者对角线方向的。

    public static boolean isConsecutiveFour(int[][]values) 编写一个测试程序,提示用户输人一个二维数组的行数、列数以及数组中的值。 如果这个数组有四个连续的数字具有相同的值,就显示true;否则,显示false。下面是结果为true的一些例子:

    这里我只做出来水平方向:

    1. package Exer2;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4. public class Demo100 {
    5. /*
    6. (模式识别:连续的四个相等的数)编写下面的方法,测试一个二维数组是否有四个连续的数字具有相同的值,
    7. 这四个数可以是水平方向的、垂直方向的或者对角线方向的。
    8. public static boolean isConsecutiveFour(int[][]values)
    9. 编写一个测试程序,提示用户输人一个二维数组的行数、列数以及数组中的值。
    10. 如果这个数组有四个连续的数字具有相同的值,就显示true;否则,显示false。下面是结果为true的一些例子:
    11. */
    12. public static void main(String[] args) {
    13. Scanner scan = new Scanner(System.in);
    14. System.out.println("请输入一个二维数组的行数、列数以及数组中的值(前两个数分别表示行、列):");
    15. int row = scan.nextInt();
    16. int column = scan.nextInt();
    17. int[][] values = new int[row][column];
    18. for (int i = 0; i < values.length; i++) {
    19. for (int j = 0; j < values[i].length; j++) {
    20. values[i][j] = scan.nextInt();
    21. }
    22. }
    23. // 6 7 0 1 0 3 1 6 1 0 1 6 8 6 0 1 5 6 2 1 8 2 9 6 5 6 1 1 9 1 1 3 6 1 4 0 7 3 3 3 3 4 0 7
    24. System.out.println(Arrays.deepToString(values));
    25. System.out.println(isConsecutiveFour(values));
    26. }
    27. public static boolean isConsecutiveFour(int[][] values) {
    28. if (values.length < 4 || values[0].length < 4) {
    29. return false;
    30. }
    31. int rowCount = 1, columnCount = 1, count = 1, antiCount = 1;
    32. for (int i = 1; i < values.length; i++) {
    33. for (int j = 1; j < values[i].length; j++) {
    34. // 判断行
    35. if (values[i - 1][j - 1] == values[i - 1][j] || values[i][j - 1] == values[i][j]){
    36. rowCount++;
    37. } else {
    38. rowCount = 1;
    39. }
    40. // 判断列
    41. if (values[i - 1][j - 1] == values[i][j - 1] || values[i - 1][j] == values[i][j]){
    42. columnCount++;
    43. } else {
    44. columnCount = 0;
    45. }
    46. // 副对角线
    47. if (i >= 3) {
    48. // TODO
    49. }
    50. // 主对角线
    51. if (j <= 3) {
    52. // TODO
    53. }
    54. if (rowCount >= 4 || columnCount >= 4) {
    55. return true;
    56. }
    57. }
    58. }
    59. return false;
    60. }
    61. }

    Demo101. (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏中, 玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中,如下所示。 这个游戏的目的是在对手实现一行、一列或者一条对角线上有四个相同颜色的棋子之前, 你能先做到。

    程序提示两个玩家交替地下红子Red或黄子Yellow。 当放下一子时,程序在控制台重新显示这个棋盘,然后确定游戏的状态(赢、平局还是继续)。

    下面是一个运行示例:

    1. package Exer2;
    2. import java.util.Scanner;
    3. public class Demo101 {
    4. /*
    5. (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏中,
    6. 玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中,如下所示。
    7. 这个游戏的目的是在对手实现一行、一列或者一条对角线上有四个相同颜色的棋子之前,
    8. 你能先做到。程序提示两个玩家交替地下红子Red或黄子Yellow。
    9. 当放下一子时,程序在控制台重新显示这个棋盘,然后确定游戏的状态(赢、平局还是继续)。下面是一个运行示例:
    10. */
    11. static Scanner in = new Scanner(System.in);
    12. public static void main(String[] args) {
    13. char[][] chess = new char[6][15];
    14. for (int i = 0; i < chess.length; i++) //初始化棋盘
    15. {
    16. for (int j = 0; j < chess[i].length; j++) {
    17. if (j % 2 == 0)
    18. chess[i][j] = '|';
    19. else
    20. chess[i][j] = ' ';
    21. }
    22. }
    23. beginGame(chess);
    24. in.close();
    25. }
    26. //开始比赛
    27. public static void beginGame(char[][] chess) {
    28. char disk;
    29. for (int i = 0; i < 42; i++) {
    30. if (i % 2 == 0)
    31. disk = 'R';
    32. else
    33. disk = 'Y';
    34. printChessBoard(chess);
    35. System.out.println("——————————————");
    36. if (dropDisk(chess, disk) == 0) {
    37. i--;
    38. continue;
    39. }
    40. if (judge(chess) == 0) {
    41. System.out.println("The red player won");
    42. return;
    43. } else if (judge(chess) == 1) {
    44. System.out.println("The yellow player won");
    45. return;
    46. }
    47. }
    48. System.out.println("No winner");
    49. }
    50. //落子
    51. public static int dropDisk(char[][] chess, char disk) {
    52. if (disk == 'R')
    53. System.out.print("Drop a red disk at column(0-6):");
    54. else
    55. System.out.print("Drop a yellow disk at column(0-6):");
    56. int key = in.nextInt();
    57. if (key < 0 || key > 6) {
    58. System.out.println("Enter error!");
    59. return 0;
    60. }
    61. key = key * 2 + 1;
    62. for (int row = chess.length - 1; row >= 0; row--) {
    63. if (chess[row][key] == ' ') {
    64. chess[row][key] = disk;
    65. return 1;
    66. }
    67. }
    68. System.out.println("This colum is no more position!");
    69. return 0;
    70. }
    71. //打印棋盘
    72. public static void printChessBoard(char[][] chess) {
    73. for (int i = 0; i < chess.length; i++) {
    74. for (int j = 0; j < chess[i].length; j++)
    75. System.out.print(chess[i][j]);
    76. System.out.println();
    77. }
    78. }
    79. //判断输赢,返回0'R'赢,返回1'Y'赢,返回2未分出胜负
    80. public static int judge(char[][] chess) {
    81. if (judgeRow(chess) != 2)
    82. return judgeRow(chess);
    83. if (judgeCol(chess) != 2)
    84. return judgeCol(chess);
    85. if (judgeMainDiagonal(chess) != 2)
    86. return judgeMainDiagonal(chess);
    87. if (judgeSubDiagonal(chess) != 2)
    88. return judgeSubDiagonal(chess);
    89. return 2;
    90. }
    91. //判断行是否有四个相等的
    92. public static int judgeRow(char[][] chess) {
    93. for (int i = 0; i < chess.length; i++)
    94. for (int j = 1; j < chess[i].length - 6; j += 2) {
    95. if (chess[i][j] == chess[i][j + 2] && chess[i][j] == chess[i][j + 4] && chess[i][j] == chess[i][j + 6] && chess[i][j] != ' ')
    96. if (chess[i][j] == 'R')
    97. return 0;
    98. else
    99. return 1;
    100. }
    101. return 2;
    102. }
    103. //判断列是否有四个相等的
    104. public static int judgeCol(char[][] chess) {
    105. for (int i = 0; i < chess.length - 3; i++)
    106. for (int j = 1; j < chess[i].length; j += 2) {
    107. if (chess[i][j] == chess[i + 1][j] && chess[i][j] == chess[i + 2][j] && chess[i][j] == chess[i + 3][j] && chess[i][j] != ' ')
    108. if (chess[i][j] == 'R')
    109. return 0;
    110. else
    111. return 1;
    112. }
    113. return 2;
    114. }
    115. //判断主对角线是否有四个相等的
    116. public static int judgeMainDiagonal(char[][] chess) {
    117. for (int i = 0; i < chess.length - 3; i++)//主对角线
    118. for (int j = 1; j < chess[i].length - 6; j += 2) {
    119. if (chess[i][j] == chess[i + 1][j + 2] && chess[i][j] == chess[i + 2][j + 4] && chess[i][j] == chess[i + 3][j + 6] && chess[i][j] != ' ')
    120. if (chess[i][j] == 'R')
    121. return 0;
    122. else
    123. return 1;
    124. }
    125. return 2;
    126. }
    127. //判断副对角线是否有四个相等的
    128. public static int judgeSubDiagonal(char[][] chess) {
    129. for (int i = 3; i < chess.length; i++)//副对角线
    130. for (int j = 1; j < chess[i].length - 6; j += 2) {
    131. if (chess[i][j] == chess[i - 1][j + 2] && chess[i][j] == chess[i - 2][j + 4] && chess[i][j] == chess[i - 3][j + 6] && chess[i][j] != ' ')
    132. if (chess[i][j] == 'R')
    133. return 0;
    134. else
    135. return 1;
    136. }
    137. return 2;
    138. }
    139. }

    结果:

    Demo102. (马尔科夫矩阵)一个n×n的矩阵被称为一个正马尔科夫矩阵,当且仅当每个元素都是正数, 并且每列的元素的和为1。编写下面的方法来检测一个矩阵是否是一个马尔科夫矩阵。

    public static boolean isMarkovMatrix(double[][] m) 编写一个测试程序,提示用户输人一个3×3的double值的矩阵,测试它是否是一个马尔科夫矩阵。下面是一个运行示例:

    1. package Exer2;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4. public class Demo102 {
    5. /*
    6. (马尔科夫矩阵)一个n×n的矩阵被称为一个正马尔科夫矩阵,当且仅当每个元素都是正数,
    7. 并且每列的元素的和为1。编写下面的方法来检测一个矩阵是否是一个马尔科夫矩阵。
    8. public static boolean isMarkovMatrix(double[][] m)
    9. 编写一个测试程序,提示用户输人一个3×3的double值的矩阵,测试它是否是一个马尔科夫矩阵。下面是一个运行示例:
    10. */
    11. /*
    12. 0.15 0.875 0.375
    13. 0.55 0.005 0.225
    14. 0.30 0.12 0.4
    15. */
    16. public static void main(String[] args) {
    17. Scanner scan = new Scanner(System.in);
    18. double[][] m = new double[3][3];
    19. System.out.println("Enter a 3-by-3 matrix row by row:");
    20. for (int i = 0; i < m.length; i++) {
    21. for (int j = 0; j < m[i].length; j++) {
    22. m[i][j] = scan.nextDouble();
    23. }
    24. }
    25. System.out.println(Arrays.deepToString(m));
    26. if (isMarkovMatrix(m)) {
    27. System.out.println("It is a Markov matrix");
    28. } else {
    29. System.out.println("It is not a Markov matrix");
    30. }
    31. }
    32. public static boolean isMarkovMatrix(double[][] m) {
    33. double sum = 0;
    34. for (int i = 0; i < m.length; i++) {
    35. for (int j = 0; j < m[i].length; j++) {
    36. sum += m[j][i];
    37. if (m[i][j] <= 0) {
    38. return false;
    39. }
    40. }
    41. if (sum != 1) {
    42. return false;
    43. } else {
    44. sum = 0;
    45. }
    46. }
    47. return true;
    48. }
    49. }

    结果:

    Demo103. (几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积

    public static double getTriangleArea(double[][] points)

    点保存在一个3×2的二维矩阵points中,其中 ( points[0][0],points[0][1])代表(x1, y1)。三角形面积的计算可以使用编程练习题2.19中的公式。如果三个点在一条直线上,方法返回0。编写一个程序,提示用户输入三角形的三个点,然后显示三角形的面积。下面是一个运行示例。

    1. package Exer2;
    2. import java.util.Scanner;
    3. public class Demo103 {
    4. /*
    5. (几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积
    6. public static double getTriangleArea(double[][] points)
    7. 点保存在一个3×2的二维矩阵points中,其中 ( points[0][0],points[0][1])代表(x1, y1)。
    8. 三角形面积的计算可以使用编程练习题2.19中的公式。如果三个点在一条直线上,方法返回0。
    9. 编写一个程序,提示用户输入三角形的三个点,然后显示三角形的面积。下面是一个运行示例。
    10. 计算三角形面积的公式是:
    11. s = (边1 + 边2 + 边3 ) / 2
    12. 面积 = √(s(s - 边1)(s - 边2)(s - 边3))
    13. 2.5 2 5 -1.0 4.0 2.0
    14. */
    15. public static void main(String[] args) {
    16. Scanner scan = new Scanner(System.in);
    17. System.out.println("Enter x1, y1, x2, y2, x3, y3:");
    18. double[][] points = new double[3][2];
    19. for (int i = 0; i < points.length; i++) {
    20. for (int j = 0; j < points[i].length; j++) {
    21. points[i][j] = scan.nextDouble();
    22. }
    23. }
    24. scan.close();
    25. if (getTriangleArea(points) == 0) {
    26. System.out.println("The three points are on the same Line");
    27. } else {
    28. System.out.printf("The ares of the triangle is %.2f", getTriangleArea(points));
    29. }
    30. }
    31. public static double getTriangleArea(double[][] points) {
    32. double area = 0;
    33. double d1 = Math.pow(Math.pow(points[1][0] - points[0][0], 2) + Math.pow(points[1][1] - points[0][1], 2), 0.5);
    34. double d2 = Math.pow(Math.pow(points[2][0] - points[1][0], 2) + Math.pow(points[2][1] - points[1][1], 2), 0.5);
    35. double d3 = Math.pow(Math.pow(points[2][0] - points[0][0], 2) + Math.pow(points[2][1] - points[0][1], 2), 0.5);
    36. // double d1 = Math.pow(((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)), 0.5);
    37. // double d2 = Math.pow(((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)), 0.5);
    38. // double d3 = Math.pow(((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3)), 0.5);
    39. if (d1 <= d2 + d3 || d1 >= Math.abs(d2 - d3)) {
    40. double s = (d1 + d2 + d3) / 2;
    41. area = Math.pow(s * (s - d1) * (s - d2) * (s - d3), 0.5);
    42. } else {
    43. return 0;
    44. }
    45. return area;
    46. }
    47. }

    结果:注意精度问题,double运算时,失之毫厘,缪之千里

    Demo104. (几何:多边形的子面积)一个具有四个顶点的凸多边形被分为四个三角形,编写一个程序,提示用户输入四个顶点的坐标,然后以升序显示四个三角形的面积。

    下面是一个运行示例。

    1. package Exer2;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4. public class Demo104 {
    5. public static void main(String[] args) {
    6. /*
    7. Enter x1, y1, x2, y2, x3, y3, x4, y4:
    8. -2.5 2 4 4 3 -2 -2 -3.5
    9. The areas are 6.17 7.96 8.08 10.42
    10. */
    11. //1. 获取四个点的坐标,使用数组读入
    12. Scanner scan = new Scanner(System.in);
    13. System.out.println("Enter x1, y1, x2, y2, x3, y3, x4, y4:");
    14. double[][] points = new double[4][2];
    15. for (int i = 0; i < points.length; i++) {
    16. for (int j = 0; j < points[i].length; j++) {
    17. points[i][j] = scan.nextDouble();
    18. }
    19. }
    20. scan.close();
    21. //2. 求v1v3和v2v4线的交点坐标
    22. double[] crossPoint = intersection(points);
    23. //3. 自定义方法求三角形面积(传入数组、下标、交点坐标数组),使用数组接收
    24. double[] areas = new double[4];
    25. for (int i = 0 ; i < 4 ; i++){
    26. areas[i] = getTriangleArea(points, i, crossPoint);
    27. }
    28. Arrays.sort(areas);
    29. System.out.print("The areas are ");
    30. for (double area : areas) {
    31. System.out.printf("%.2f ", area);
    32. }
    33. }
    34. // 求v1v3和v2v4线的交点坐标
    35. public static double[] intersection(double[][] arr) {
    36. double[] feedback = new double[2];
    37. double k02 = (arr[2][1] - arr[0][1]) / (arr[2][0] - arr[0][0]);
    38. double k13 = (arr[3][1] - arr[1][1]) / (arr[3][0] - arr[1][0]);
    39. double b02 = arr[0][1] - k02 * arr[0][0];
    40. double b13 = arr[1][1] - k13 * arr[1][0];
    41. double x = (b02 - b13) / (k13 - k02);
    42. double y = (b02 * k13 - b13 * k02) / (k13 - k02);
    43. feedback[0] = x;
    44. feedback[1] = y;
    45. return feedback;
    46. }
    47. // 求三角形面积
    48. public static double getTriangleArea(double[][] points, int index, double[] crossPoint) {
    49. double area = 0;
    50. int index1 = (index + 1) % 4;
    51. double d1 = Math.pow(Math.pow(points[index1][0] - points[index][0], 2) + Math.pow(points[index1][1] - points[index][1], 2), 0.5);
    52. double d2 = Math.pow(Math.pow(points[index1][0] - crossPoint[0], 2) + Math.pow(points[index1][1] - crossPoint[1], 2), 0.5);
    53. double d3 = Math.pow(Math.pow(points[index][0] - crossPoint[0], 2) + Math.pow(points[index][1] - crossPoint[1], 2), 0.5);
    54. double s = (d1 + d2 + d3) / 2;
    55. area = Math.pow(s * (s - d1) * (s - d2) * (s - d3), 0.5);
    56. return area;
    57. }
    58. }

    结果:

    Demo105. (拉丁正方形)拉丁正方形是一个n×n的数组,由n个不同的拉丁字母填充,每个拉丁字母恰好只在每行和每列中出现一次。编写一个程序,提示用户输人数字n以及字符数组,如示例输出所示,检测该输出数组是否是一个拉丁正方形。字符是从A开始的前面n个字符。

    1. package Exer2;
    2. import java.util.HashSet;
    3. import java.util.Scanner;
    4. public class Demo105 {
    5. /*
    6. (拉丁正方形)拉丁正方形是一个n×n的数组,由n个不同的拉丁字母填充,每个拉丁字母恰好只在每行和每列中出现一次。
    7. 编写一个程序,提示用户输人数字n以及字符数组,如示例输出所示,检测该输出数组是否是一个拉丁正方形。字符是从A开始的前面n个字符。
    8. Enter number n:4
    9. Enter 4 rows of letters separated by spaces:
    10. A B C D
    11. B A D C
    12. C D B A
    13. D C A B
    14. The input array is a Latin square
    15. */
    16. public static void main(String[] args) {
    17. Scanner scan = new Scanner(System.in);
    18. System.out.print("Enter number n:");
    19. int number = scan.nextInt();
    20. System.out.printf("Enter %s rows of letters separated by spaces:%n", number);
    21. char[][] latin = new char[number][number];
    22. for (int i = 0; i < number; i++) {
    23. for (int j = 0; j < number; j++) {
    24. latin[i][j] = scan.next().charAt(0);
    25. if (latin[i][j] > ('A' - 1 + number)) {
    26. System.out.println("Wrong input: the letters must be from A to " + (char) ('A' - 1 + number));
    27. System.exit(1);
    28. }
    29. }
    30. }
    31. if (isLatin(latin)) {
    32. System.out.println("The input array is a Latin square");
    33. } else {
    34. System.out.println("The input array is not a Latin square");
    35. }
    36. }
    37. private static boolean isLatin(char[][] latin) {
    38. HashSet set1 = new HashSet<>();
    39. HashSet set2 = new HashSet<>();
    40. for (int i = 0; i < latin.length; i++) {
    41. set1.clear();
    42. set2.clear();
    43. for (int j = 0; j < latin[i].length; j++) {
    44. if (!set1.add(latin[i][j]) || !set2.add(latin[j][i])) {
    45. return false;
    46. }
    47. }
    48. }
    49. return true;
    50. }
    51. }

    结果:

  • 相关阅读:
    Mybatis01、Mybatis简介
    【算法与数据结构】450、LeetCode删除二叉搜索树中的节点
    主成分分析(机器学习)
    中通IM测试实践
    图像处理--平滑
    怎么压缩视频?最新压缩技巧大分享
    网页期末作业 基于HTML+CSS中国传统节日【清明节】带论文8000字
    UDP服务端丢包-发送频率过高导致丢包
    I/O软件层次结构(用户层软件,设备独立性软件,设备驱动程序,中断处理程序,硬件)
    php单独使用laravel数据库
  • 原文地址:https://blog.csdn.net/weixin_51612062/article/details/126428681