我在查找矩阵中start [0] [0]和end [1] [2]点之间的最短路径时遇到问题。
EG。
------------
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>
答案 0 :(得分:3)
简单的方法使用动态编程的想法。 这是主逻辑(O(N ^ 2)):
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + cost[i][j]
它也可以使用Dijkstra和任何其他最短路径算法来解决。但DP是最容易的。