数据结构(4)-JAVA-递归与矩阵的应用

掌握栈与递归、矩阵的相关知识,设计算法实现

1.汉诺塔Hanoi问题
2.斐波那契数列Fibo的求解
3.马鞍点问题

汉诺塔问题问题:输出把n个圆盘借助圆柱y从x移动到z的过程

package ds.recursive;
/***
 * 汉诺塔问题
 * @author 1
 *
 */
 public class Hanoi {
 private static int i=0;
 public static void hanoi(int n,char x,char y,char z){//把n个圆盘借助圆柱B从A移动到C
  if(n==1){
   move(x,1,z);//把1号圆盘从x移到z
  }else{
  hanoi(n-1,x,z,y);
   move(x,n,z);
   hanoi(n-1,y,x,z);//在y上借助x移到z
  }
 }
 
private static void move(char A, int n, char C) {//把第n个圆盘从圆柱
  System.out.println("第"+ (++i) +"次移动:把"+n+"号圆盘从"+A+"->"+C);
 }
 
public static void main(String[] args) {
  hanoi(3, 'A', 'B', 'C');
 }

运行结果:

在这里插入图片描述

斐波那契数列问题:输出斐波那契数列前n项

package ds.recursive;
import java.util.Scanner;
/**
 * 输出斐波那契数列的前n项值
 * @author 1
 *
 */
 public class Fib {
 //返回斐波那契数列的第n项
 public static int fib(int n){
  if (n==1 ||n==2) {
   return 1;
  } else {
   return fib(n-1)+fib(n-2);
  }
 }
 public static void main(String[] args) {
  Scanner in = new Scanner(System.in);
  int a = in.nextInt();
  System.out.println("斐波那契数列的前"+ a +"项如下所示");
  for (int i = 1; i < a+1; i++) {
   System.out.print(fib(i)+"\t"); 
  }
 }
}

运行结果:

在这里插入图片描述

马鞍点问题:若在矩阵Amxn中存在一个元素A[i-1][j-1]满足:A[i-1][j-1]是第i行中最小值,且又是第j列中最大值,则称此元素为该矩阵的一个马鞍点。假设以二维数组存储矩阵Amxn,试编写求出矩阵中所有马鞍点的算法

两种方法:
1、个人解决的方法:

package ds.recursive;
import java.util.Scanner;
/**
 * 马鞍点问题:若在矩阵Am*n中存在一个元素A[i-1][j-1]满足:A[i-1][j-1]是第i行中最小值
 * 且又是第j列中最大值,则称此元素为该矩阵的一个马鞍点
 * 
 * @author 1
 *
 */
 public class MaAnDian {
 private int [][]A;
 public void init(int m,int n) {//初始化矩阵
  A= new int[m][n];
  Scanner in = new Scanner(System.in);
  for (int i = 0; i < A.length; i++) {// 行
   for (int j = 0; j < A[i].length; j++) {// 列
    System.out.println("请输入第" + (i + 1) + "行,第" + (j + 1) + "列的元素:");
    A[i][j] = in.nextInt();
   }
  }
 }

public void show() {//显示矩阵
  System.out.println("矩阵如下所示:");
  for (int i = 0; i < A.length; i++) {// 行
   for (int j = 0; j < A[i].length; j++) {// 列
    System.out.print(A[i][j] + "\t");
   }
   System.out.println();
  }
 }

public void maxmin() {
  int temp, min, minCol;// temp为判断变量,min为行最小值,minCol为最小值所在的列
  for (int i = 0; i < A.length; i++) {// 外层是每一行的循环
   temp = 0;//每一行都使temp为0.用于判断
   min = A[i][0];
   minCol = 0;
   for (int j = 0; j < A[i].length; j++) {// 找出第i行的最小值
    if (A[i][0] < min) {
     min = A[i][j];
     minCol = j;
    }
   }
   for (int k = 0; k < A.length; k++) {// 判断该最小值是不是所在列的最大值,如果不是,令temp=1
    if (min < A[k][minCol])
     temp = 1;
   }
   if (temp == 0) {//根据temp判断马鞍点是否成立,成立即输出
    System.out.println("马鞍点为第" + (i + 1) + "行   第" + (minCol + 1) + "列  大小为" + min);
    break;
   }
  }
 }

/**
  * @param args
  */
 public static void main(String[] args) {
  MaAnDian m = new MaAnDian();
  //三行四列
  m.init(3,4);// // 初始化矩阵A:init(A)
  m.show();// 输出矩阵:show(A)
  m.maxmin();// 判断矩阵的马鞍点,并输出结果maxmin(A);
  // 1 2 3 4
  // 5 6 7 8
  // 5 8 9 7
  // 该矩阵马鞍点为5
 }
} 

老师传授的方法:(易懂)

package ds.recursive;
import java.util.Scanner;
/**
 * 马鞍点问题:若在矩阵Am*n中存在一个元素A[i-1][j-1]满足:A[i-1][j-1]是第i行中最小值
 * 且又是第j列中最大值,则称此元素为该矩阵的一个马鞍点
 * 
 * @author 1
 * 
 */
 public class TeacherMa {
 private int[][] A;
 public void init(int m, int n) {// 初始化矩阵
  A = new int[m][n];
  Scanner in = new Scanner(System.in);
  for (int i = 0; i < A.length; i++) {// 行
   for (int j = 0; j < A[i].length; j++) {// 列
    System.out.println("请输入第" + (i + 1) + "行,第" + (j + 1) + "列的元素:");
    A[i][j] = in.nextInt();
   }
  }
 }

public void show() {// 显示矩阵
  System.out.println("矩阵如下所示:");
  for (int i = 0; i < A.length; i++) {// 行
   for (int j = 0; j < A[i].length; j++) {// 列
    System.out.print(A[i][j] + "\t");
   }
   System.out.println();
  }
 }

public void maxmin() {
  int m = A.length;
  int n = A[0].length;
  // min[]:存放每行的最小值
  TriInfo min[] = new TriInfo[m];
  for (int i = 0; i < m; i++) {
   min[i] = new TriInfo();
   min[i].value = A[i][0];
   min[i].i = i;
   min[i].j = 0;
   for (int j = 0; j < n; j++) {
    if (A[i][j] < min[i].value) {
     min[i].value = A[i][j];
     min[i].i = i;
     min[i].j = j;
    }
   }
  }
  // max[]:存放每列的最大值
  TriInfo max[] = new TriInfo[n];
  for (int j = 0; j < n; j++) {
   max[j] = new TriInfo();
   max[j].value = A[0][j];
   max[j].i = 0;
   max[j].j = j;
   for (int i = 0; i < m; i++) {
    if(A[i][j] > max[j].value){
     max[j].value=A[i][j];
     max[j].i=i;
     max[j].j=j;
    }
   }
  }

// 比较每行最小值和每列最大值是否一致,如果一致则为马鞍点
  boolean have = false ;
  for(int i= 0 ;i<m ;i++){
   for(int j= 0;j<n;j++){
    if(min[i].value==max[j].value&&min[i].i==max[j].i&&min[i].j==min[i].j){
     System.out.println("马鞍点为第" + (i+1) + "行   第" + (j+1) + "列  大小为" + A[i][j]);
     have = true;
    }
   }
  }
  if(!have){
   System.out.println("马鞍点不存在!");
  }
 }

/**
  * 三元组类
  */
  class TriInfo {
  public int value;
  public int i; // 行号
  public int j; // 列号
 }

public static void main(String[] args) {
  TeacherMa m = new TeacherMa();
  // 三行四列
  m.init(3, 4);// // 初始化矩阵A:init(A)
  m.show();// 输出矩阵:show(A)
  m.maxmin();// 判断矩阵的马鞍点,并输出结果maxmin(A);
  // 1 2 3 4
  // 5 6 7 8
  // 5 8 9 7
  // 该矩阵马鞍点为5
 }
}

运行结果:

在这里插入图片描述

该文章仅供个人学习和大家参考,如果有问题的地方,希望大家指正

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你白勺男孩TT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值