C/C++

Задачка на программирование С++

Помогите найти ошибку. В каких-то случаях программа работает корректно, а в каких-то выдает ошибку. Закономерности я не вижу. Проблема с выводом ходов, если поле 1х1 понятна, но вроде поля 1х1 в задаче быть и не может. И правда, куда тогда идти?
#include <iostream>

#include <vector>

using namespace std;

int main()

{

int n, m;

cin >> n >> m;

vector < vector<int> > A(n+1, vector<int> (m+1));

for ( int i = 1; i < n+1; ++i){

for ( int j = 1; j < m+1; ++j){

cin >> A[i][j];

}

}

for ( int i = 1; i < n+1; ++i){

for ( int j = 1; j < m+1; ++j){

A[i][j] += max( A[i-1][j], A[i][j-1]);

}

}

cout << A[n][m] << endl;

vector<string> W;

while ( n != 1 || m != 1){

if ( A[n-1][m] > A[n][m-1]){

W.push_back("D");

--n;

}

else{

W.push_back("R");

--m;

}

}

for ( int i = W.size(); i >= 0; --i){

cout << W[i-1] << " ";

}

}
Для 1x1 стоимость без маршрута выводится.
В последнем цикле ошибка: i > 0 условие должно быть. Либо сделать int i = (int)W.size() - 1, и при распечатке единицу не надо отнимать.
СП
Сергей Попов
20 861
Лучший ответ
#include <iostream>

#include <vector>

using namespace std;

typedef vector<vector<uint16_t>> vec;


struct obj

{

static obj best;

static vec map;

uint16_t value{};

string path{};

uint16_t x{}, y{};

obj move_right()

{

obj temp = *this;

temp.y += 1;

temp.path += 'R';

return temp;

}

obj move_down()

{

obj temp = *this;

temp.x+=1;

temp.path += 'D';

return temp;

}

};

vec obj::map = { {1,1,1} , { 0,0,2 }, { 0,1,3 } }; // для испытаний забинден
// для релиза здесь пустое обьявление, а задание размера и содержания сделать
// отдельно;

obj obj::best={};


uint16_t finder(obj it)

{

it.value += obj::map[it.x][it.y];

if (it.x == obj::map.size() - 1 && it.y == obj::map[0].size() - 1)

{

if (it.value > obj::best.value) obj::best = it;

return 1;

}

return (it.x < obj::map.size() - 1 ? finder(it.move_down()) : 0) + (it.y < obj::map[0].size() - 1 ? finder(it.move_right()) : 0);

}


int main()

{

obj start;

finder(start);

cout << obj::best.path << " " << obj::best.value;

}

Наверное поздновато, но изначально я допустил в програме небольшую оплошность и это стоило мне волос на голове. Пока искал в чем проблема - удалил часть с заполнением массива. но это не важно.