掌握栈与递归、矩阵的相关知识,设计算法实现
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
}
}
运行结果:
该文章仅供个人学习和大家参考,如果有问题的地方,希望大家指正