#include <iostream>
#include <vector>
#include <cstdint>
#include <tuple>
#include <algorithm>
#include <array>
typedef std::vector<std::vector<std::uint64_t>> MapType;
typedef std::tuple<std::int64_t, std::int64_t> Point;
typedef std::vector<Point> FootPrint;
int Pa = 2;
std::uintmax_t PoorSearch(const MapType& M, const Point& Fst, const Point& Last) {
std::uintmax_t W = 0;
std::int64_t i = 0;
std::size_t j = 0;
for (j= std::get<1>(Fst);j != std::get<1>(Last); j += (std::get<1>(Fst) - std::get<1>(Last)) ? 1 : -1) {
W += M[j][std::get<0>(Fst)];
}
for (i = std::get<0>(Fst); i != std::get<0>(Last); i += (std::get<0>(Fst) - std::get<0>(Last)) ? 1 : -1) {
W += M[j-1][i];
}
return W;
}
/**/
bool SearchPath_r(const MapType& M, FootPrint FP, const Point& Now, const Point& Last, const std::uintmax_t& Wait, std::intmax_t& Min,FootPrint& FPR) {
static std::array<int, 4> XP = { 0,1,0,-1 };
static std::array<int, 4> YP = { 1,0,-1,0 };
static std::uintmax_t C = 0;
auto X1 = std::get<0>(Now);
auto Y1 = std::get<1>(Now);
auto X2 = std::max<int>(std::get<0>(Last)-1, 0);
auto Y2 = std::max<int>(std::get<1>(Last)-1, 0);
if ((X1 == X2) && (Y1 == Y2)) {
if (Min >= Wait) {
Min = Wait;
C++;
FPR = FP;
//ESS::Locate(15, 0);
//std::cout << C;
}
//ESS::Locate(std::get<0>(Now)+Pa, std::get<1>(Now)+Pa);
//std::cout << ' ';
return true;
}
if (Min <= Wait) {
//ESS::Locate(std::get<0>(Now)+Pa, std::get<1>(Now)+Pa);
//std::cout << ' ';
return false;
}
//ESS::Locate(std::get<0>(Now)+Pa, std::get<1>(Now)+Pa);
//std::cout << '*' ;
FP.push_back({ std::get<0>(Now),std::get<1>(Now) });
for (std::size_t i = 0; i < 4; i++) {
if (std::get<0>(Now) + XP[i] < 0) { continue; };
if (std::get<1>(Now) + YP[i] < 0) { continue; };
if (std::get<0>(Now) + XP[i] >= M.front().size() ) { continue; }
if (std::get<1>(Now) + YP[i] >= M.size()) { continue; }
auto it = std::find_if(FP.begin(), FP.end(), [&](auto& o) {return (std::get<0>(o) == std::get<0>(Now) + XP[i]) && (std::get<1>(o) == std::get<1>(Now) + YP[i]); });
if (it != FP.end()) { continue; }
SearchPath_r(M, FP,{ std::get<0>(Now) + XP[i],std::get<1>(Now) + YP[i] }, Last, Wait + M[std::get<1>(Now) + YP[i]][std::get<0>(Now) + XP[i]], Min,FPR);
}
FP.pop_back();
//ESS::Locate(std::get<0>(Now)+Pa, std::get<1>(Now)+Pa);
//std::cout << ' ';
return true;
}
std::tuple<std::uintmax_t,FootPrint> SearchPath(const MapType& M, const Point& Fst, const Point& Last) {
std::intmax_t Min = PoorSearch(M, Fst, Last);
FootPrint fp;
FootPrint FPR;
//fp.push_back({ 0,0 });
//ESS::Locate(std::get<0>(Fst)+Pa, std::get<1>(Fst)+Pa);
//std::cout << '*';
SearchPath_r(M, fp, Fst, Last, 0, Min,FPR);
return { Min,FPR };
}
MapType MakeVector() {
MapType M{
{0,2,9,5,3,9,4,1,3 },
{7,1,5,4,6,7,9,8,8 },
{8,3,4,1,1,2,9,4,6 },
{2,3,7,1,6,5,4,2,6 },
{4,7,3,8,5,7,3,6,0 },
};
return M;
}
int main() {
MapType M = MakeVector();
FootPrint FP;
std::uintmax_t R;
std::tie(R,FP) = SearchPath(M, { 0,0 }, { 9,5 });
//ESS::Locate(0, 10);
std::cout << R << std::endl;
for (auto& o : FP) {
std::cout << std::get<0>(o) << ',' << std::get<1>(o) << ',' << M[std::get<1>(o)][std::get<0>(o)] << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPHR1cGxlPiAKI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGFycmF5PgoKCnR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjp1aW50NjRfdD4+IE1hcFR5cGU7CnR5cGVkZWYgc3RkOjp0dXBsZTxzdGQ6OmludDY0X3QsIHN0ZDo6aW50NjRfdD4gUG9pbnQ7CnR5cGVkZWYgc3RkOjp2ZWN0b3I8UG9pbnQ+IEZvb3RQcmludDsKCmludCBQYSA9IDI7CgpzdGQ6OnVpbnRtYXhfdCBQb29yU2VhcmNoKGNvbnN0IE1hcFR5cGUmIE0sIGNvbnN0IFBvaW50JiBGc3QsIGNvbnN0IFBvaW50JiBMYXN0KSB7CgoJc3RkOjp1aW50bWF4X3QgVyA9IDA7CglzdGQ6OmludDY0X3QgaSA9IDA7CglzdGQ6OnNpemVfdCBqID0gMDsKCWZvciAoaj0gc3RkOjpnZXQ8MT4oRnN0KTtqICE9IHN0ZDo6Z2V0PDE+KExhc3QpOyBqICs9IChzdGQ6OmdldDwxPihGc3QpIC0gc3RkOjpnZXQ8MT4oTGFzdCkpID8gMSA6IC0xKSB7CgkJVyArPSBNW2pdW3N0ZDo6Z2V0PDA+KEZzdCldOwoJfQoKCWZvciAoaSA9IHN0ZDo6Z2V0PDA+KEZzdCk7IGkgIT0gc3RkOjpnZXQ8MD4oTGFzdCk7IGkgKz0gKHN0ZDo6Z2V0PDA+KEZzdCkgLSBzdGQ6OmdldDwwPihMYXN0KSkgPyAxIDogLTEpIHsKCQlXICs9IE1bai0xXVtpXTsKCX0KCgkKCglyZXR1cm4gVzsKfQovKiovCmJvb2wgU2VhcmNoUGF0aF9yKGNvbnN0IE1hcFR5cGUmIE0sIEZvb3RQcmludCBGUCwgY29uc3QgUG9pbnQmIE5vdywgY29uc3QgUG9pbnQmIExhc3QsIGNvbnN0IHN0ZDo6dWludG1heF90JiBXYWl0LCBzdGQ6OmludG1heF90JiBNaW4sRm9vdFByaW50JiBGUFIpIHsKCXN0YXRpYyBzdGQ6OmFycmF5PGludCwgND4gWFAgPSB7IDAsMSwwLC0xIH07CglzdGF0aWMgc3RkOjphcnJheTxpbnQsIDQ+IFlQID0geyAxLDAsLTEsMCB9OwoJc3RhdGljIHN0ZDo6dWludG1heF90IEMgPSAwOwoKCWF1dG8gWDEgPSBzdGQ6OmdldDwwPihOb3cpOwoJYXV0byBZMSA9IHN0ZDo6Z2V0PDE+KE5vdyk7CglhdXRvIFgyID0gc3RkOjptYXg8aW50PihzdGQ6OmdldDwwPihMYXN0KS0xLCAwKTsKCWF1dG8gWTIgPSBzdGQ6Om1heDxpbnQ+KHN0ZDo6Z2V0PDE+KExhc3QpLTEsIDApOwoJaWYgKChYMSA9PSBYMikgJiYgKFkxID09IFkyKSkgewoJCWlmIChNaW4gPj0gV2FpdCkgewoJCQlNaW4gPSBXYWl0OwoJCQlDKys7CQoJCQlGUFIgPSBGUDsKCQkJLy9FU1M6OkxvY2F0ZSgxNSwgMCk7CgkJCS8vc3RkOjpjb3V0IDw8IEM7CgkJfQoJCS8vRVNTOjpMb2NhdGUoc3RkOjpnZXQ8MD4oTm93KStQYSwgc3RkOjpnZXQ8MT4oTm93KStQYSk7CgkJLy9zdGQ6OmNvdXQgPDwgJyAnOwoJCXJldHVybiB0cnVlOwoJfQoKCWlmIChNaW4gPD0gV2FpdCkgewoJCS8vRVNTOjpMb2NhdGUoc3RkOjpnZXQ8MD4oTm93KStQYSwgc3RkOjpnZXQ8MT4oTm93KStQYSk7CgkJLy9zdGQ6OmNvdXQgPDwgJyAnOwoJCXJldHVybiBmYWxzZTsKCX0KCS8vRVNTOjpMb2NhdGUoc3RkOjpnZXQ8MD4oTm93KStQYSwgc3RkOjpnZXQ8MT4oTm93KStQYSk7CgkvL3N0ZDo6Y291dCA8PCAnKicgOwoJRlAucHVzaF9iYWNrKHsgc3RkOjpnZXQ8MD4oTm93KSxzdGQ6OmdldDwxPihOb3cpIH0pOwoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IDQ7IGkrKykgewoJCWlmIChzdGQ6OmdldDwwPihOb3cpICsgWFBbaV0gPCAwKSB7IGNvbnRpbnVlOyB9OwoJCWlmIChzdGQ6OmdldDwxPihOb3cpICsgWVBbaV0gPCAwKSB7IGNvbnRpbnVlOyB9OwoJCWlmIChzdGQ6OmdldDwwPihOb3cpICsgWFBbaV0gPj0gTS5mcm9udCgpLnNpemUoKSApIHsgY29udGludWU7IH0KCQlpZiAoc3RkOjpnZXQ8MT4oTm93KSArIFlQW2ldID49IE0uc2l6ZSgpKSB7IGNvbnRpbnVlOyB9CgkJYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihGUC5iZWdpbigpLCBGUC5lbmQoKSwgWyZdKGF1dG8mIG8pIHtyZXR1cm4gKHN0ZDo6Z2V0PDA+KG8pID09IHN0ZDo6Z2V0PDA+KE5vdykgKyBYUFtpXSkgJiYgKHN0ZDo6Z2V0PDE+KG8pID09IHN0ZDo6Z2V0PDE+KE5vdykgKyBZUFtpXSk7IH0pOwoKCQlpZiAoaXQgIT0gRlAuZW5kKCkpIHsgY29udGludWU7IH0KCgoJCVNlYXJjaFBhdGhfcihNLCBGUCx7IHN0ZDo6Z2V0PDA+KE5vdykgKyBYUFtpXSxzdGQ6OmdldDwxPihOb3cpICsgWVBbaV0gfSwgTGFzdCwgV2FpdCArIE1bc3RkOjpnZXQ8MT4oTm93KSArIFlQW2ldXVtzdGQ6OmdldDwwPihOb3cpICsgWFBbaV1dLCBNaW4sRlBSKTsKCQkKCgoJfQoJRlAucG9wX2JhY2soKTsKCS8vRVNTOjpMb2NhdGUoc3RkOjpnZXQ8MD4oTm93KStQYSwgc3RkOjpnZXQ8MT4oTm93KStQYSk7CgkvL3N0ZDo6Y291dCA8PCAnICc7CglyZXR1cm4gdHJ1ZTsKCgoKfQoKc3RkOjp0dXBsZTxzdGQ6OnVpbnRtYXhfdCxGb290UHJpbnQ+IFNlYXJjaFBhdGgoY29uc3QgTWFwVHlwZSYgTSwgY29uc3QgUG9pbnQmIEZzdCwgY29uc3QgUG9pbnQmIExhc3QpIHsKCXN0ZDo6aW50bWF4X3QgTWluID0gUG9vclNlYXJjaChNLCBGc3QsIExhc3QpOwoJRm9vdFByaW50IGZwOwoJRm9vdFByaW50IEZQUjsKCS8vZnAucHVzaF9iYWNrKHsgMCwwIH0pOwoJLy9FU1M6OkxvY2F0ZShzdGQ6OmdldDwwPihGc3QpK1BhLCBzdGQ6OmdldDwxPihGc3QpK1BhKTsKCS8vc3RkOjpjb3V0IDw8ICcqJzsKCVNlYXJjaFBhdGhfcihNLCBmcCwgRnN0LCBMYXN0LCAwLCBNaW4sRlBSKTsKCglyZXR1cm4geyBNaW4sRlBSIH07Cgp9CgoKTWFwVHlwZSBNYWtlVmVjdG9yKCkgewoJTWFwVHlwZSBNewoJCXswLDIsOSw1LDMsOSw0LDEsMyB9LAoJCXs3LDEsNSw0LDYsNyw5LDgsOCB9LAoJCXs4LDMsNCwxLDEsMiw5LDQsNiB9LAoJCXsyLDMsNywxLDYsNSw0LDIsNiB9LAoJCXs0LDcsMyw4LDUsNywzLDYsMCB9LAoJfTsKCglyZXR1cm4gTTsKfQoKaW50IG1haW4oKSB7CglNYXBUeXBlIE0gPSBNYWtlVmVjdG9yKCk7CglGb290UHJpbnQgRlA7CglzdGQ6OnVpbnRtYXhfdCBSOwoJc3RkOjp0aWUoUixGUCkgPSBTZWFyY2hQYXRoKE0sIHsgMCwwIH0sIHsgOSw1IH0pOwoJLy9FU1M6OkxvY2F0ZSgwLCAxMCk7CglzdGQ6OmNvdXQgPDwgUiA8PCBzdGQ6OmVuZGw7Cglmb3IgKGF1dG8mIG8gOiBGUCkgewoKCQlzdGQ6OmNvdXQgPDwgc3RkOjpnZXQ8MD4obykgPDwgJywnIDw8IHN0ZDo6Z2V0PDE+KG8pIDw8ICcsJyA8PCBNW3N0ZDo6Z2V0PDE+KG8pXVtzdGQ6OmdldDwwPihvKV0gPDwgc3RkOjplbmRsOwoJfQoKCXJldHVybiAwOwp9