Загрузка...

Help with a task

Thread in C/C++ created by impelix Nov 26, 2022. 214 views

  1. impelix
    impelix Topic starter Nov 26, 2022 5 Nov 28, 2021
    Есть задча
    На стандартной шахматной доске (8х8) живут 2 шахматных коня: красный и зеленый. Обычно они беззаботно скачут по просторам доски, пощипывая шахматную травку, но сегодня особенный день: у зеленого коня день рождения. зеленый конь решил отпраздновать это событие вместе с красным. Но для осуществления этого прекрасного плана им нужно оказаться на одной клетке. Заметим, что красный и зеленый шахматные кони сильно отличаются от черного с белым: они ходят не по очереди, а одновременно, и если оказываются на одной клетке, никто никого не съедает. Сколько ходов им потребуется, чтобы насладиться праздником?
    и мой код который захоит только на 7 тестов из 10.
    не пойму в чем дело

    C
    #include <bits/stdc++.h>
    #include <vector>
    #include <queue>
    #include <limits>
    #include <string>
    using namespace std;

    int di[8] = { -2, -2, -1, 1, 2, 2, -1, 1 };
    int dj[8] = { -1, 1, -2, -2, -1, 1, 2, 2 };

    int get_num(char letter) {
    if (letter == 'a') {
    return 1;
    }
    else if (letter == 'b') {
    return 2;
    }
    else if (letter == 'c') {
    return 3;
    }
    else if (letter == 'd') {
    return 4;
    }
    else if (letter == 'e') {
    return 5;
    }
    else if (letter == 'f') {
    return 6;
    }
    else if (letter == 'g') {
    return 7;
    }
    else{
    return 8;
    }
    }

    vector<vector<int>>d1;
    void bfs1(int ui, int uj) {
    queue<pair<int, int>>q;
    q.push({ ui, uj });
    d1[ui][uj] = 0;
    while (!q.empty()) {
    ui = q.front().first;
    uj = q.front().second;
    q.pop();
    for (int h = 0; h < 8; h++) {
    int toi = ui + di[h];
    int toj = uj + dj[h];
    if (toi < 8 && toi > -1 && toj > -1 && toj < 8) {
    if (d1[toi][toj] == INT_MAX) {
    d1[toi][toj] = d1[ui][uj] + 1;
    q.push({ toi, toj });
    }
    }
    }
    }
    }

    vector<vector<int>>d2;
    void bfs2(int ui, int uj) {
    queue<pair<int, int>>q;
    q.push({ ui, uj });
    d2[ui][uj] = 0;
    while (!q.empty()) {
    ui = q.front().first;
    uj = q.front().second;
    q.pop();
    for (int h = 0; h < 8; h++) {
    int toi = ui + di[h];
    int toj = uj + dj[h];
    if (toi < 8 && toi > -1 && toj > -1 && toj < 8) {
    if (d2[toi][toj] == INT_MAX) {
    d2[toi][toj] = d2[ui][uj] + 1;
    q.push({ toi, toj });
    }
    }
    }
    }
    }

    int main() {
    string st, nd;
    cin >> st >> nd;
    int x1 = get_num(st[0]);
    int y1 = st[1] - '0';
    int x2 = get_num(nd[0]);
    int y2 = nd[1] - '0';
    d1.resize(8, vector<int>(8, INT_MAX));
    bfs1(x1 - 1, y1 - 1);

    d2.resize(8, vector<int>(8, INT_MAX));
    bfs2(x2 - 1, y2 - 1);

    int min = INT_MAX;
    for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
    if (d2[i][j] != 0 && d1[i][j] != 0 && d1[i][j] + d2[i][j] < min) {
    min = d1[i][j] + d2[i][j];
    }
    }
    }

    if (min == INT_MAX) {
    cout << -1;
    }
    else {
    cout << min / 2;
    }
    }
     
  2. Celeste
    Celeste Nov 26, 2022 ♕Climbing for strawberries and finding myself...♕ 9694 Oct 26, 2021
    Объясни, что делает код/по какому алгоритму ты решаешь, чтобы по возможности найти ошибку в рассуждениях и исправить
     
    1. impelix Topic starter
      Celeste, есть обход бфс, и суть в тос чтобы заметить когда 2 коня будут в одной клетке в один ход.
Top
Loading...