
Untitled
By: a guest on
May 5th, 2012 | syntax:
C++ | size: 1.85 KB | hits: 14 | expires: Never
std::vector<std::pair<int,int> > res;
std::pair<int,int> p;
p.first = row1;
p.second = col1;
if (row1 == row2 && col1 == col2) {
res.push_back(p);
return res;
}
int r = m.get_rows();
int c = m.get_cols();
if (row1 < 0 || row1 >= r || col1 < 0 || col1 >= c) {
throw std::range_error("bad row/col");
}
if (row2 < 0 || row2 >= r || col2 < 0 || col2 >= c) {
throw std::range_error("bad row/col");
}
Matrix<bool> bm(r, c);
int i, j;
for (i = 0; i < r; ++i) {
for (j = 0; j < c; ++j) {
bm.at(i, j) = f(m, i, j);
}
}
Matrix<int> dm(r, c);
dm = calc_distance(bm, row2, col2, t);
std::vector<std::pair<int,int> > nbhd;
std::vector<std::pair<int,int> >::iterator ni;
int d = dm.at(row1, col1);
bool ok = false;
const int MAX = std::numeric_limits<int>::max();
if (d == MAX) {
nbhd = t(row1, col1);
ni = nbhd.begin();
while (ni != nbhd.end()) {
if (dm.at(ni->first, ni->second) < d) {
d = dm.at(ni->first, ni->second);
}
++ni;
}
if (d == MAX) {
return res;
}
} else {
--d;
}
res.push_back(p);
while (d >= 0) {
i = res.back().first;
j = res.back().second;
nbhd = t(i, j);
ni = nbhd.begin();
ok = false;
while (ni != nbhd.end()) {
if (dm.at(ni->first, ni->second) == d) {
p.first = ni->first;
p.second = ni->second;
res.push_back(p);
ok = true;
break;
}
++ni;
}
if (!ok) {
res.clear();
return res;
}
--d;
}
return res;