Бесконечный цикл в Knight's Tour с использованием C++

Я пытаюсь решить проблему рыцарского путешествия, но она застревает в бесконечном цикле. Я пробовал отлаживать, но без изменений. Может ли кто-нибудь помочь мне? Спасибо.

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

void knightMove(int x, int y, vector<vector<int>> chess, int moves) {
    // check if the cell is valid to make a move
    if(x<0 || x>=8 || y<0 || y>=8 || chess[x][y]!=-1) return;
    // if it is valid, we put the current move number in place
    chess[x][y] = moves;
    // base condition to print the final answer and return
    if(moves==63) {
        for(int p=0; p<8; p++) {
          for(int q=0; q<8; q++) {
            cout << chess[p][q] << " ";
          }
          cout << endl;
        }
        chess[x][y]=-1;
        return;
    }
    // traversal arrays
    int i[] = {2,2,-2,-2,1,1,-1,-1};
    int j[] = {1,-1,1,-1,2,-2,2,-2};

    for(int k=0; k<8; k++) {
        knightMove(x+i[k], y+j[k], chess, moves+1);
    }
    // backtracking
    chess[x][y]=-1;
    return;
}

int main() {
    vector<vector<int>> chess (8, vector<int> (8,-1));
    knightMove(0,0,chess, 0);
}

person Sridev    schedule 30.05.2021    source источник
comment
в строке for(int k=0; k‹8; k++) я заметил, что если изменить условие на k ‹ 4, то код не застрянет в бесконечном цикле. Может быть, вы хотите подробнее изучить цикл for.   -  person Job_September_2020    schedule 30.05.2021
comment
Как вы проверяете бесконечный цикл? Может просто нужно время, чтобы обработать все рекурсии?   -  person mattlangford    schedule 30.05.2021
comment
@Sridev, я думаю, есть способ исправить или остановить бесконечный цикл. Если вы измените строку if( moves == 63) на if ( moves ‹= 63 ), тогда код завершится нормально и выведет некоторые выходные данные. (Примечание: я не знаю, является ли это изменение правильным алгоритмом).   -  person Job_September_2020    schedule 30.05.2021
comment
Вероятно, я найду эти вопросы и ответы, которые стоит прочитать.   -  person WhozCraig    schedule 30.05.2021
comment
@mattlangford мой визуальный код студии просто сдается через несколько секунд, я проверил бесконечный цикл, записав координаты посещения в журнал консоли, и он просто останавливается после достижения около 55 ходов из 63 необходимых. Я пытался запустить его и в других системах / IDE, но получил тот же результат.   -  person Sridev    schedule 30.05.2021
comment
@WhozCraig Спасибо за ссылку на тему. Я проверю это прямо сейчас.   -  person Sridev    schedule 30.05.2021
comment
Этот код правильный в том смысле, что он не запускает бесконечный цикл и в конечном итоге завершится. Просто исследовать каждый тупик методом грубой силы требуется очень много времени. Я не могу воспроизвести остановку на 55 ходах - она ​​у меня постоянно доходит до 61, но оставшиеся два квадрата всегда недостижимы, поэтому приходится возвращаться.   -  person Igor Tandetnik    schedule 30.05.2021
comment
Спасибо @IgorTandetnik за подтверждение. Я беспокоился, что в моей логике есть какая-то ошибка, и ее нужно исправить. Возможно, моя IDE/система имеет свои ограничения и, следовательно, не превышает 55-56.   -  person Sridev    schedule 30.05.2021
comment
Вы можете легко улучшить производительность с помощью void knightMove(int x, int y, vector<vector<int>>& chess, int moves) {...} Обратите внимание на амперсанд. Вы передаете доску по значению, тем самым делая много копий. Передача по ссылке позволяет избежать этих копий. Это все еще слишком медленно, чтобы найти решение за разумное время, но таким образом он должен добраться до 61.   -  person Igor Tandetnik    schedule 30.05.2021
comment
Есть ли у вас особые причины для этих антишаблонов с кодовым гольфом?   -  person Yunnosch    schedule 30.05.2021
comment
@IgorTandetnik, это помогло, большое спасибо.   -  person Sridev    schedule 30.05.2021
comment
@Yunnosch Прости, но я тебя не понял. Я нуб в этом, не могли бы вы сообщить мне о каких-либо ошибках в коде?   -  person Sridev    schedule 30.05.2021
comment
Единственная известная мне причина, по которой я делаю эти вещи #include <bits/stdc++.h> using namespace std; , — это игра в гольф с кодом. Вы пытаетесь код-гольф это?   -  person Yunnosch    schedule 30.05.2021
comment
@Yunnosch, это не может быть кодовый гольф. Единственный другой заголовок, который ему нужен, это вектор, и #include <bits/stdc++.h> длиннее, чем #include <vector> Я думаю, его научили включать биты/stdc++.h для удобства, чтобы ему не приходилось помнить, в каких заголовках находятся вещи (хотя вектор довольно прост выяснить)   -  person Jerry Jeremiah    schedule 31.05.2021
comment
Что касается #include <bits/stdc++.h>: stackoverflow.com/questions/31816095/ stackoverflow.com/questions/31816095/   -  person Jerry Jeremiah    schedule 31.05.2021
comment
Что касается using namespace std;: stackoverflow.com/questions/1452721/   -  person Jerry Jeremiah    schedule 31.05.2021
comment
Что касается вашей среды выполнения, вы можете попробовать другой набор векторов движения. Пример: int i[] = { 2, 1, -1, -2, -2, -1, 1, 2 }; int j[] = { 1, 2, 2, 1, -1, -2, -2, -1 }; С точки зрения сложности все то же самое, но шаблон заполнения должен завершиться намного раньше, если он начинается в начале координат 0,0.   -  person WhozCraig    schedule 31.05.2021
comment
Насколько я могу судить, код работает, но, в худшем случае, он должен проверить триллионы (или более!) позиций на доске, поэтому ему может потребоваться несколько дней, чтобы что-то найти. Если вы хотите проверить, работает ли он, используйте доску 5x5, и он завершится быстрее.   -  person Jerry Jeremiah    schedule 31.05.2021
comment
Другое дело, я не думаю, что он останавливается, когда находит ответ - похоже, что в этом случае он возвращается так же, как и при возврате...   -  person Jerry Jeremiah    schedule 31.05.2021
comment
@JerryJeremiah Я не сомневаюсь, что это успешный код для гольфа. Я сомневаюсь, что это сознательная попытка закодировать гольф. Потому что если это не так, то это указывает на плохие привычки из-за попыток научиться программированию в сообществах, бросающих вызов. Я бы связался с теми же вещами, которые вы указали в этом случае.   -  person Yunnosch    schedule 31.05.2021