Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 5th, 2012  |  syntax: C++  |  size: 1.85 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. std::vector<std::pair<int,int> > res;
  2.     std::pair<int,int> p;
  3.     p.first = row1;
  4.     p.second = col1;
  5.     if (row1 == row2 && col1 == col2) {
  6.         res.push_back(p);
  7.         return res;
  8.     }
  9.     int r = m.get_rows();
  10.     int c = m.get_cols();
  11.     if (row1 < 0 || row1 >= r || col1 < 0 || col1 >= c) {
  12.         throw std::range_error("bad row/col");
  13.     }
  14.     if (row2 < 0 || row2 >= r || col2 < 0 || col2 >= c) {
  15.         throw std::range_error("bad row/col");
  16.     }
  17.     Matrix<bool> bm(r, c);
  18.     int i, j;
  19.     for (i = 0; i < r; ++i) {
  20.         for (j = 0; j < c; ++j) {
  21.             bm.at(i, j) = f(m, i, j);
  22.         }
  23.     }
  24.     Matrix<int> dm(r, c);
  25.     dm = calc_distance(bm, row2, col2, t);
  26.     std::vector<std::pair<int,int> >  nbhd;
  27.     std::vector<std::pair<int,int> >::iterator ni;
  28.     int d = dm.at(row1, col1);
  29.     bool ok = false;
  30.     const int MAX = std::numeric_limits<int>::max();
  31.     if (d == MAX) {
  32.         nbhd = t(row1, col1);
  33.         ni = nbhd.begin();
  34.         while (ni != nbhd.end()) {
  35.             if (dm.at(ni->first, ni->second) < d) {
  36.                 d = dm.at(ni->first, ni->second);
  37.             }
  38.             ++ni;
  39.         }
  40.         if (d == MAX) {
  41.             return res;
  42.         }
  43.     } else {
  44.         --d;
  45.     }
  46.     res.push_back(p);
  47.     while (d >= 0) {
  48.         i = res.back().first;
  49.         j = res.back().second;
  50.         nbhd = t(i, j);
  51.         ni = nbhd.begin();
  52.         ok = false;
  53.         while (ni != nbhd.end()) {
  54.             if (dm.at(ni->first, ni->second) == d) {
  55.                 p.first = ni->first;
  56.                 p.second = ni->second;
  57.                 res.push_back(p);
  58.                 ok = true;
  59.                 break;
  60.             }
  61.             ++ni;
  62.         }
  63.         if (!ok) {
  64.             res.clear();
  65.             return res;
  66.         }
  67.         --d;
  68.     }
  69.     return res;