java - 在二维矩阵中找到最左边和最右边角之间的最短路径

标签 java algorithm shortest-path

<分区>

我在寻找矩阵中开始 [0][0] 和结束 [1][2] 点之间的最短路径时遇到问题。

例如。

------------
3  | 44 | 75 |
------------
21 | 98 | 60 | 
-------------

每个值表示穿过每个点所需的成本。您可以移动到它紧邻的右侧单元格或下方的单元格。不允许对角线移动。

我应该使用哪种算法,比如 BFS,dijkstra?

1)

package com.oft.controller;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.oft.service.OverviewService;
import com.oft.valueobjects.OrderOverviewData;
import com.oft.valueobjects.OrderOverviewForm;
import com.oft.valueobjects.OrderOverviewResponse;

@Controller
@RequestMapping(value="Overview")
public class OverviewController
{
    @Autowired
    OverviewService service;

    @RequestMapping(value="Order.spring",method=RequestMethod.GET)
    public String getOrderView(ModelMap map,HttpSession session)
    {
/*      OrderOverviewForm form=new OrderOverviewForm(null, null, "SELL", 0);
        List<OrderOverviewData> datas=(List<OrderOverviewData>)service.getOrderOverview(form, 1);

        for (Iterator iterator = datas.iterator(); iterator.hasNext();) {
            OrderOverviewData orderOverviewData = (OrderOverviewData) iterator.next();  
            System.out.println(orderOverviewData);
        }*/

        map.addAttribute("ViewOrders", new OrderOverviewForm());
        return "ViewOrders";
    }

    @RequestMapping(value="Order1.spring",produces="application/json")
    public @ResponseBody OrderOverviewResponse getOrderOverview(@ModelAttribute("ViewOrders")OrderOverviewForm form)
    {
        System.out.println("In overview POST"+form.getAccId());

        OrderOverviewForm order = new OrderOverviewForm();
        order.setAccId(100);

        List<OrderOverviewData> datas=(List<OrderOverviewData>)service.getOrderOverview(order, 1);

        for (Iterator iterator = datas.iterator(); iterator.hasNext();) {
            OrderOverviewData orderOverviewData = (OrderOverviewData) iterator.next();  
            System.out.println(orderOverviewData);
        }
        OrderOverviewResponse response=new OrderOverviewResponse();

        response.setPage("1");
        response.setTotal("5");
        response.setRows(datas);
        response.setRecords(String.valueOf(datas.size()));

        return response;
    }

    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView getFundPriceView()
    {

        return new ModelAndView("ViewFundPrice");
    }


}

2)

package com.oft.valueobjects;

import java.io.Serializable;
import java.util.List;

public class OrderOverviewResponse implements Serializable
{

    public String page;
    public String total;
    public String records;
    public List<OrderOverviewData> rows;
//getter and setter
    public OrderOverviewResponse() {
        super();
        // TODO Auto-generated constructor stub
    }

    public OrderOverviewResponse(String page, String total, String records,
            List<OrderOverviewData> rows) {
        super();
        this.page = page;
        this.total = total;
        this.records = records;
        this.rows = rows;
    }
    public String getPage() {
        return page;
    }
    public void setPage(String page) {
        this.page = page;
    }
    public String getTotal() {
        return total;
    }
    public void setTotal(String total) {
        this.total = total;
    }
    public String getRecords() {
        return records;
    }
    public void setRecords(String records) {
        this.records = records;
    }
    public List<OrderOverviewData> getRows() {
        return rows;
    }
    public void setRows(List<OrderOverviewData> rows) {
        this.rows = rows;
    }




}

3)

package com.oft.valueobjects;

import java.util.Date;

public class OrderOverviewForm {

    private Date FromDate;
    private Date ToDate;
    private Integer AccId;
    private String TransactionType;
    public OrderOverviewForm() {
        super();
        // TODO Auto-generated constructor stub
    }
    public OrderOverviewForm(Date fromDate, Date toDate, Integer accId,
            String transactionType) {
        super();
        FromDate = fromDate;
        ToDate = toDate;
        AccId = accId;
        TransactionType = transactionType;
    }
    public Date getFromDate() {
        return FromDate;
    }
    public void setFromDate(Date fromDate) {
        FromDate = fromDate;
    }
    public Date getToDate() {
        return ToDate;
    }
    public void setToDate(Date toDate) {
        ToDate = toDate;
    }
    public Integer getAccId() {
        return AccId;
    }
    public void setAccId(Integer accId) {
        AccId = accId;
    }
    public String getTransactionType() {
        return TransactionType;
    }
    public void setTransactionType(String transactionType) {
        TransactionType = transactionType;
    }
    @Override
    public String toString() {
        return "OrderOverviewForm [AccId=" + AccId + ", TransactionType="
                + TransactionType + "]";
    }


}

4)

package com.oft.valueobjects;

import java.math.BigDecimal;
import java.util.Date;

public class OrderOverviewData {
private Integer CusId;
private Integer AccId;
private Integer OrdId;
private Date OrdDate;
private String OrdType;
private BigDecimal OrdAmount;
private BigDecimal OrdUnits;
private Integer FundId;
public OrderOverviewData() {
    super();
    // TODO Auto-generated constructor stub
}
public OrderOverviewData(Integer cusId, Integer accId, Integer ordId,
        Date ordDate, String ordType, BigDecimal ordAmount,
        BigDecimal ordUnits, Integer fundId) {
    super();
    CusId = cusId;
    AccId = accId;
    OrdId = ordId;
    OrdDate = ordDate;
    OrdType = ordType;
    OrdAmount = ordAmount;
    OrdUnits = ordUnits;
    FundId = fundId;
}
public Integer getCusId() {
    return CusId;
}
public void setCusId(Integer cusId) {
    CusId = cusId;
}
public Integer getAccId() {
    return AccId;
}
public void setAccId(Integer accId) {
    AccId = accId;
}
public Integer getOrdId() {
    return OrdId;
}
public void setOrdId(Integer ordId) {
    OrdId = ordId;
}
public Date getOrdDate() {
    return OrdDate;
}
public void setOrdDate(Date ordDate) {
    OrdDate = ordDate;
}
public String getOrdType() {
    return OrdType;
}
public void setOrdType(String ordType) {
    OrdType = ordType;
}
public BigDecimal getOrdAmount() {
    return OrdAmount;
}
public void setOrdAmount(BigDecimal ordAmount) {
    OrdAmount = ordAmount;
}
public BigDecimal getOrdUnits() {
    return OrdUnits;
}
public void setOrdUnits(BigDecimal ordUnits) {
    OrdUnits = ordUnits;
}
public Integer getFundId() {
    return FundId;
}
public void setFundId(Integer fundId) {
    FundId = fundId;
}
@Override
public String toString() {
    return "OrderOverviewData [CusId=" + CusId + ", AccId=" + AccId
            + ", OrdId=" + OrdId + ", OrdDate=" + OrdDate + ", OrdType="
            + OrdType + ", OrdAmount=" + OrdAmount + ", OrdUnits=" + OrdUnits
            + ", FundId=" + FundId + "]";
}




}

5)

CREATE FUNCTION GetHoldings(CustId INT)
RETURNS TABLE(CusId INT,AccId INT,FundId INT,FundName VARCHAR(25),TotalAmount decimal(10,2),Price decimal(10,2),PriceDate DATE,Currency VARCHAR(3))
READS SQL DATA
BEGIN ATOMIC

DECLARE CurDate DATE;

SET CurDate = CURRENT_DATE;

RETURN TABLE
(
select a.CusId, t.AccId ,f.FundId,f.FundName,t.TotalAmount,fp.Price,fp.PriceDate,f.Currency 
FROM Account as a
INNER JOIN (select AccId,FundId,SUM(OrdAmount) AS TotalAmount from ORDERS GROUP BY AccId,FundId order by AccId) t
ON a.AccId=t.AccId
INNER JOIN Fund as f
ON f.FundId=t.FundId
INNER JOIN FundPrice as fp
ON f.FundId=fp.FundId AND fp.PriceDate = CurDate
WHERE a.CusId = CustId

);

END

6)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript"
    src="<c:url value="/resources/js/jquery-1.11.1.min.js"></c:url>"></script>
<script type="text/javascript"
    src="<c:url value="/resources/js/jquery.jqGrid.min.js"></c:url>"></script>
<script type="text/javascript"
    src="<c:url value="/resources/js/jquery-ui.min.js"></c:url>"></script>

<link type="text/css" rel="stylesheet"
    href="<c:url value="/resources/css/jquery-ui.min.css"></c:url>" />
<link type="text/css" rel="stylesheet"
    href="<c:url value="/resources/css/ui.jqgrid.css"></c:url>" />


<script type="text/javascript">
    $(function() {
        $("#submit").click(
                function() {

                    $("#grid").jqGrid(
                            {

                                url : 'Order1.spring?AccId='
                                        + $('#AccId').val(),
                                contentType : 'application/json',
                                datatype : 'json',
                                colNames : [ 'Order Id', 'Customer Id',
                                        'Account Id', 'Order Id', 'Order Date',
                                        'Order Amount', 'Order Units',
                                        'Order Type' ],
                                colModel : [ {
                                    name : 'ordId',
                                    index : 'ordId',
                                    hidden : true,
                                }, {
                                    name : 'cusId',
                                    index : 'cusId',
                                }, {
                                    name : 'accId',
                                    index : 'accId',
                                }, {
                                    name : 'ordId',
                                    index : 'ordId',
                                }, {
                                    name : 'ordDate',
                                    index : 'ordDate',
                                }, {
                                    name : 'ordAmount',
                                    index : 'ordAmount',
                                }, {
                                    name : 'ordUnits',
                                    index : 'ordUnits',
                                }, {
                                    name : 'ordType',
                                    index : 'ordType',
                                }

                                ],
                                viewrecords : true,
                                rowNum : 10,
                                rowList : [ 10, 20, 40, 60 ],
                                pager : '#pager',
                                caption : 'Orders Summary',
                                jsonReader : {
                                    root : "rows",
                                    page : "page",
                                    total : "total",
                                    records : "records",
                                    repeatitems : false,
                                    cell : "cell",
                                    id : "ordId"
                                }
                            });

                    $("#grid").jqGrid('navGrid', '#pager', {
                        edit : false,
                        add : false,
                        del : false,
                        search : true
                    }, {}, {}, {}, { // search
                        sopt : [ 'cn', 'eq', 'ne', 'lt', 'gt', 'bw', 'ew' ],
                        closeOnEscape : true,
                        multipleSearch : true,
                        closeAfterSearch : true
                    });

                });

    });
</script>

</head>
<body>
    <form:form id="target" commandName="ViewOrders">

        <table>
            <tr>
                <td>Enter AccId</td>
                <td><form:input path="AccId" id="AccId" />
            </tr>
            <tr>
                <td>From Date</td>
                <td><input type="text" id="FromDate" /></td>
                <td>To Date</td>
                <td><input type="text" id="ToDate" /></td>
            </tr>
            <tr>
                <td>Enter Transaction Type</td>
                <td><input type="text" id="TransactionType" /></td>
            </tr>
            <tr>
                <td colspan="4"><input type="button" id="submit"
                    value="Get Orders"></td>
            </tr>
        </table>
    </form:form>

    <div id="jqgrid">
        <table id="grid"></table>
        <div id="pager"></div>
    </div>

</body>

</html>

最佳答案

简单的方法使用动态规划思想。 这是主要逻辑(O(N ^ 2)):

dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + cost[i][j]

它也可以使用 Dijkstra 和任何其他最短路径算法来解决。但 DP 是最简单的。

关于java - 在二维矩阵中找到最左边和最右边角之间的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23929774/

相关文章:

algorithm - 使用重复值快速选择

algorithm - 允许穿过有限数量的墙的迷宫中的最短路径?

algorithm - 对 Dijkstra 算法的证明感到困惑

algorithm - DAG 中所有对之间的最长路径

java - 在Spring webflux Flux响应中将一个响应对象转换为另一个对象(pojo)而不订阅它

java - Android Java - 下载管理器未使用正确的名称保存

java - Java中静态 block 的执行

php - 名称比较算法

java - JBoss ESB : Using HTTPRouter with a secure endpoint and no keystore

java - 并行运行的最大任务量?