Два коня и праздник, что не так с кодом?

Условия задачи
На стандартной шахматной доске (8х8) живут 2 шахматных коня: красный и зеленый. Обычно они беззаботно скачут по просторам доски, пощипывая шахматную травку, но сегодня особенный день: у зеленого коня день рождения. зеленый конь решил отпраздновать это событие вместе с красным. Но для осуществления этого прекрасного плана им нужно оказаться на одной клетке. Заметим, что красный и зеленый шахматные кони сильно отличаются от черного с белым: они ходят не по очереди, а одновременно, и если оказываются на одной клетке, никто никого не съедает. Сколько ходов им потребуется, чтобы насладиться праздником?

Задача заходит только на 7 тестов из 10
никак не могу понять почему
мой код
#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;
    }
}
  • Вопрос задан
  • 776 просмотров
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Мне кажется шахматисты-теоретики давно расковыряли коня со всех сторон. DFS/BFS - это игра вслепую.
А может быть есть некий сет стратегий которые ведут к победе. Например.
- один конь делает нейтральные шаги туда-сюда.
- второй конь целенаправленно двигается к этим двум шагам.
- если промахнулся и не встретил - делает 3 или 5 тоже нейтральных шагов по кругу чтобы на нечетности поймать другого коня.

UPD.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы