zoukankan      html  css  js  c++  java
  • Java实现硬币收集问题

    1 问题描述
    在n*m格木板中放有一些硬币,每格的硬币数目最多为一个,在木板左上方的一个机器人需要收集尽可能多的硬币并把它们带到右下方的单元格。每一步,机器人可以从当前的位置向右移动一格或向下移动一格。当机器人遇到一个有硬币的单元格时,就会将这枚硬币收集起来。设计一个算法找出机器人能找到的最大硬币数并给出相应的路径。

    2 解决方案
    2.1 动态规划法

    本文编码思想参考自《算法设计与分析基础》第三版,具体如下:

    package com.liuzhen.chapter8;
    
    public class RobotCoinCollection {
        //输出找到最大硬币数的路径
        public void getMaxPath(int[][] A){
            int rowA = A.length;
            int columnA = A[0].length;         
            //在数组A最上面一行添加一行元素0,在最左边一列添加一列元素0
            int[][] changeA = new int[rowA+1][columnA+1];  //初始化,各个元素均为0
            int[][] maxA = new int[rowA+1][columnA+1];   //用于计算从A[0][0]到达各元素位置收集到的最大硬币数
            for(int i = 0;i < rowA;i++){
                for(int j = 0;j < columnA;j++)
                    changeA[i+1][j+1] = A[i][j];
            }
            for(int i = 1;i <= rowA;i++){
                for(int j = 1; j <= columnA;j++){
                    if(maxA[i-1][j] >= maxA[i][j-1])
                        maxA[i][j] = maxA[i-1][j] + changeA[i][j];
                    else
                        maxA[i][j] = maxA[i][j-1] + changeA[i][j];
                }
            }
            
            //输出各个元素位置收集到的最大硬币数
            System.out.println("各个元素位置收集到的最大硬币数:");
            for(int i = 1;i <= rowA;i++){
                for(int j = 1;j <= columnA;j++)
                    System.out.print(maxA[i][j]+"	");
                System.out.println();
            }
            
            System.out.println("从左上方到右下方收集到最大硬币数的路径(PS:其中元素为-1 表示行走路径):");
            maxA[1][1] = 1;   //最左上方位置
            maxA[rowA][columnA] = -1;     //最右下方位置
            int maxI = rowA;
            int maxJ = columnA;
            while(maxI >= 1 && maxJ >= 1){
                if(maxA[maxI][maxJ-1] >= maxA[maxI-1][maxJ]){
                    maxA[maxI][maxJ-1] = -1;
                    maxJ = maxJ - 1;
                }
                else{
                    maxA[maxI-1][maxJ] = -1;
                    maxI = maxI - 1;
                }
            }
            
            for(int i = 1;i <= rowA;i++){
                for(int j = 1;j <= columnA;j++)
                    System.out.print(maxA[i][j]+"	");
                System.out.println();
            }
            
        }
        
        public static void main(String[] args){
            RobotCoinCollection test = new RobotCoinCollection();
            int[][] A ={{0,0,0,0,1,0},
                    {0,1,0,1,0,0},
                    {0,0,0,1,0,1},
                    {0,0,1,0,0,1},
                    {1,0,0,0,1,0}};
            test.getMaxPath(A);
        }
    }
    

    运行结果:

    各个元素位置收集到的最大硬币数:
    0    0    0    0    1    1    
    0    1    1    2    2    2    
    0    1    1    3    3    4    
    0    1    2    3    3    5    
    1    1    2    3    4    5    
    从左上方到右下方收集到最大硬币数的路径(PS:其中元素为-1 表示行走路径):
    -1    0    0    0    1    1    
    -1    -1    -1    -1    2    2    
    0    1    1    -1    -1    -1    
    0    1    2    3    3    -1    
    1    1    2    3    4    -1    
    
  • 相关阅读:
    CheckedListBoxControl 实现复选框的单选与多选功能
    DEV控件中GridView中的复选框与CheckBox实现联动的全选功能
    pyhon3+phoenixdb访问phoenix
    greenplum 6.0 下gpbackup的编译与使用
    greenplum下schema的使用
    greenplum6.1 使用复制表
    python动态加载脚本
    将8进制数字(文件权限)转换为rwxrwxrwx格式字符显示
    python3 load data infile for mysql5.7
    编译mysql for Qt 5.13.0驱动
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13077928.html
Copyright © 2011-2022 走看看