Застрял в бесконечном цикле (задача Найта Тур) - PullRequest
0 голосов
/ 24 сентября 2019

Задача тура Рыцаря: Рыцарь ставится на первый блок пустой доски и, двигаясь по правилам шахмат, должен посетить каждый квадрат ровно один раз.Выведите путь так, чтобы он охватывал все блоки.

Не могу понять, почему код застрял в бесконечном цикле.потраченные впустую часы все еще не имеют ни малейшего понятия.У меня есть решение, но я не мог понять, почему этот конкретный код не работает.

#include<bits/stdc++.h>
using namespace std;
#define N 8

//possible moves
int rowMove[] = {2,1,-1,-2,-2,-1,1,2};
int colMove[] = {1,2,2,1,-1,-2,-2,-1};


void printBoard(vector<vector<int>> visited)
{
    for(int i=0; i<N; i++)
    {
        for(int j=0;j<N;j++)
            cout<<visited[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
}

//check if the given move is valid
bool isValid(vector<vector<int>> visited,int row, int col)
{
    return (row>=0 && row<N && col>=0 && col<N && visited[row][col]==0);
}


bool solveKnight(vector<vector<int>> visited,int row, int col,int move)
{
    //printBoard(visited);
    if(move==N*N)
    {
        printBoard(visited);
        return true;
    }

    else
    {
        for(int i=0;i<8;i++)
        {
            int newRow = row + rowMove[i];
            int newCol = col + colMove[i];

            if(isValid(visited,newRow,newCol))
            {
                move++;
                visited[newRow][newCol] = move;
                if(solveKnight(visited,newRow,newCol,move))
                    return true;
                move--;
                visited[newRow][newCol]=0;
            }
        }
    }
    return false;
}


int main()
{
    vector<vector<int>> visited(N,vector<int>(N,0));
    visited[0][0]=1;
    if(!solveKnight(visited,0,0,1))
        cout<<"not possible";
    return 0;
}

1 Ответ

1 голос
/ 25 сентября 2019

Здесь две вещи не так:

  1. Вы копируете по 64-целому вектору каждый.Один.время.
  2. Вы печатаете 9 строк в стандартный вывод каждая.Один.время.

Обе эти операции чрезвычайно дороги.И вы можете повторить до 8 ^ 64 = 2 ^ 192 раза.Это не незначительное число.

Если вы передадите свой вектор по ссылке и убьете printBoard в начале каждого рекурсивного вызова ... альт!https://ideone.com/K0DU3q

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...