восстановление пути bfs c++ [требует правки]

404
11 января 2017, 01:48

Задача: http://informatics.mccme.ru/mod/statements/view3.php?id=255&chapterid=161 В чем хранить path коня? Point path[MAXN] ?

vector< pair > path(MAXN) ?

int path[MAXN][MAXN] ?

Чтобы потом можно было записывать для соседей вершину из который мы пришли(x,y)

Код: http://pastebin.com/RbNNNSbc

Answer 1

Ну вот, такой простенький набросок, ну очень далекий от оптимальности...

struct Cell
{
    Cell(int x, int y):x(x),y(y),prev(0),check(false){}
    int x, y;
    Cell* prev;
    bool check;
};
int dx[] = { -2, -2, -1, -1,  1,  1,  2,  2 };
int dy[] = { -1,  1, -2,  2,  2, -2,  1, -1 };
int main(int argc, const char * argv[])
{
    int N;
    int startx, starty;
    int stopx,  stopy;
    cin >> N >> startx >> starty >> stopx >> stopy;
    startx--; starty--; stopx--; stopy--;
    vector<vector<Cell>> board(N);
    for(int x = 0; x < N; ++x)
    {
        for(int y = 0; y < N; ++y)
            board[x].push_back(Cell(x,y));
    }
    queue<Cell*> Q;
    Cell * c = &board[startx][starty];
    c->check = true;
    Q.push(c);
    while(!Q.empty())
    {
        c = Q.front();
        Q.pop();
        for(int i = 0; i < 8; ++i)
        {
            int x = c->x + dx[i];
            int y = c->y + dy[i];
            if (x >= 0 && x < N && y >= 0 && y < N)
            {
                Cell* q = &board[x][y];
                if (q->check) continue;
                q->check = true;
                q->prev = c;
                Q.push(q);
                if (q->x == stopx && q->y == stopy)
                {
                    stack<Cell*> S;
                    do {
                        S.push(q);
                        q = q->prev;
                    } while(q);
                    cout << S.size()-1 << endl;
                    while(!S.empty())
                    {
                        Cell * v = S.top();
                        S.pop();
                        cout << v->x+1 << " " << v->y+1 << endl;
                    }
                    return 0;
                }
            }
        }
    }
}
READ ALSO
Программный выбор строк QComboBox

Программный выбор строк QComboBox

Есть своя реализация древовидной модели на основе QAbstractItemModelНа основе этой модели отображаются виджеты QTreeView и QComboBox (т

378
Как получить -NaN в C++ 14

Как получить -NaN в C++ 14

Как в C++ 14 с компилятором g++ (GNU C++) 47

360