Я пытаюсь решить проблему рыцарского путешествия, но она застревает в бесконечном цикле. Я пробовал отлаживать, но без изменений. Может ли кто-нибудь помочь мне? Спасибо.
#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);
}
void knightMove(int x, int y, vector<vector<int>>& chess, int moves) {...}
Обратите внимание на амперсанд. Вы передаете доску по значению, тем самым делая много копий. Передача по ссылке позволяет избежать этих копий. Это все еще слишком медленно, чтобы найти решение за разумное время, но таким образом он должен добраться до 61. - person Igor Tandetnik   schedule 30.05.2021#include <bits/stdc++.h> using namespace std;
, — это игра в гольф с кодом. Вы пытаетесь код-гольф это? - person Yunnosch   schedule 30.05.2021#include <bits/stdc++.h>
длиннее, чем#include <vector>
Я думаю, его научили включать биты/stdc++.h для удобства, чтобы ему не приходилось помнить, в каких заголовках находятся вещи (хотя вектор довольно прост выяснить) - person Jerry Jeremiah   schedule 31.05.2021#include <bits/stdc++.h>
: stackoverflow.com/questions/31816095/ stackoverflow.com/questions/31816095/ - person Jerry Jeremiah   schedule 31.05.2021using namespace std;
: stackoverflow.com/questions/1452721/ - person Jerry Jeremiah   schedule 31.05.2021int 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