Задача: 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
Ну вот, такой простенький набросок, ну очень далекий от оптимальности...
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;
}
}
}
}
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть своя реализация древовидной модели на основе QAbstractItemModelНа основе этой модели отображаются виджеты QTreeView и QComboBox (т